现在的位置: 首页 > 综合 > 正文

ZOJ1144

2019年08月21日 ⁄ 综合 ⁄ 共 1364字 ⁄ 字号 评论关闭

不错的题目,看了解题报告才会的,开始本来想用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;
}

【上篇】
【下篇】

抱歉!评论已关闭.