标签:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>
#include <queue>
#include <map>
#include <cmath>
#include <vector>
using namespace std;
#define N 500010
#define pi acos(-1.0)
#define inf 0x3f3f3f3f
#define pb(x) push_back((x))
typedef long long ll;
typedef unsigned long long ull;
int dp[110][110][110]; //定义三维空间
int step[110],stepx[110],stepy[110];
int main(){
int n,tt,x1,x2,y1,y2;
int t,w,h;
int cnt=1;
while(~scanf("%d%d%d",&w,&h,&t)){
if(t==0&&w==0&&h==0) break;
printf("Robbery #%d:\n",cnt++);
bool escape=false;
memset(dp,0,sizeof(dp));
memset(step,0,sizeof(step));
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d%d%d%d",&tt,&x1,&y1,&x2,&y2);
for(int x=x1;x<=x2;x++){
for(int y=y1;y<=y2;y++){
dp[tt][x][y]=1; //现将不能走的标记
}
}
}
for(int i=1;i<=t;i++){ //正向推一遍
for(int x=1;x<=w;x++){
for(int y=1;y<=h;y++){
if((x==1||dp[i-1][x-1][y])
&&(y==1||dp[i-1][x][y-1])
&&dp[i-1][x][y]
&&(x==w||dp[i-1][x+1][y])
&&(y==h||dp[i-1][x][y+1])) //如果之前的一个时刻没有任何一点在相邻的点
dp[i][x][y]=1; // 那么这个这个点也不能到达
if(i==t){
if(dp[t][x][y]==0){
step[t]++;
stepx[t]=x;
stepy[t]=y;
}
}
}
}
}
for(int i=t-1;i>=0;i--){ //反向推一遍
for(int x=1;x<=w;x++){
for(int y=1;y<=h;y++){
if((x==1||dp[i+1][x-1][y])
&&(y==1||dp[i+1][x][y-1])
&&dp[i+1][x][y]
&&(x==w||dp[i+1][x+1][y])
&&(y==h||dp[i+1][x][y+1]))
dp[i][x][y]=1;
if(dp[i][x][y]==0){
step[i]++;
stepx[i]=x;
stepy[i]=y;
}
}
}
}
for(int i=0;i<=t;i++) if(step[i]==0) escape=true; //如果已经逃脱
if (escape) printf("The robber has escaped.\n");
else{
int count=0;
for(int i=1;i<=t;i++){
if(step[i]==1){
printf("Time step %d: The robber has been at %d,%d.\n",i,stepx[i],stepy[i]);
count++;
}
}
if(count==0) printf("Nothing known.\n"); //如果没有任何一条线索
}
printf("\n");
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/bryant03/article/details/51331494