不错的题目,看了解题报告才会的,开始本来想用dfs搞的,结果爆栈了,想了也是,没有visit数组,只要限制一小绝对爆栈,看了别人的解题报告才知道,由于这题只需记录每个时刻每个点的状态,无需点dfs,因为不需要路径,只需要知道可否到,所以floodfill从前到后再从后到前即可。
开始没看清题,抢匪每步可以停留一下,因此wa了2次,汗~~
#include<cstdio>
#include<cstring>
int w,h,t;
bool g[110][110][110];
int num[110],xx[110],yy[110];
int ok(int t,int x,int y,int f)
{
if(x>1&&!g[t+f][x-1][y])return 0;
if(x<w&&!g[t+f][x+1][y])return 0;
if(y>1&&!g[t+f][x][y-1])return 0;
if(y<h&&!g[t+f][x][y+1])return 0;
if(!g[t+f][x][y])
return 0;
return 1;
}
int main()
{
int pro=0;
while(scanf("%d%d%d",&w,&h,&t),w||h||t)
{
int n,out=0;
scanf("%d",&n);
memset(g,0,sizeof(g));
memset(num,0,sizeof(num));
for(int i=1;i<=n;i++)
{
int t,a,b,c,d;
scanf("%d%d%d%d%d",&t,&a,&b,&c,&d);
for(int y=a;y<=c;y++)
for(int z=b;z<=d;z++)
g[t][y][z]=1;
}
printf("Robbery #%d:\n",++pro);
for(int k=2;k<=t;k++)
for(int i=1;i<=w;i++)
for(int j=1;j<=h;j++)
{
if(!g[k][i][j]&&ok(k,i,j,-1))
g[k][i][j]=1;
}
for(int i=1;i<=w;i++)
for(int j=1;j<=h;j++)
{
if(!g[t][i][j])
{
num[t]++;
xx[t]=i,yy[t]=j;
}
}
if(num[t])
out=1;
for(int k=t-1;k>=1;k--)
for(int i=1;i<=w;i++)
for(int j=1;j<=h;j++)
if(!g[k][i][j]&&ok(k,i,j,1))
g[k][i][j]=1;
for(int k=1;k<=t-1;k++)
for(int i=1;i<=w;i++)
for(int j=1;j<=h;j++)
{
if(!g[k][i][j])
{
num[k]++;
xx[k]=i,yy[k]=j;
}
}
if(!out)
printf("The robber has escaped.\n");
else
{
int flag=0;
for(int i=1;i<=t;i++)
{
if(num[i]==1)
{
flag=1;
printf("Time step %d: The robber has been at %d,%d.\n",i,xx[i],yy[i]);
}
}
if(!flag)
printf("Nothing known.\n");
}
puts("");
}
return 0;
}