uva 532 - Dungeon Master

方法一:结构体中增加一个记录时间的项。

方法二:增加一个数组int dist[maxn][maxn][maxn];记录距离。每一个单位的距离就为一个单位的时间。因此结果照样输入即可。

方法都差不多,评测结果却显示方法二要更快,为什么更快呢?还是评测结果的误差?求教。

一:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
const int maxn=40;

struct Point
{
	int x,y,z,n;
};

Point q[maxn*maxn*maxn],E;
int dir[6][3]={{0,1,0},{0,-1,0},{0,0,1},{0,0,-1},{1,0,0},{-1,0,0}};
int l,r,c;
int mat[maxn][maxn][maxn];
bool vis[maxn][maxn][maxn];

int bfs(Point A)
{
	memset(vis,0,sizeof(vis));
	vis[A.x][A.y][A.z]=true;
	A.n=0;
	int front=0,rear=0,d;
	q[rear++]=A;
	while(front<rear)
	{
		A=q[front++];
		for(d=0;d<6;d++)
		{
			Point B;
			B.x=A.x+dir[d][0];
			B.y=A.y+dir[d][1];
			B.z=A.z+dir[d][2];
			if(!mat[B.x][B.y][B.z] && !vis[B.x][B.y][B.z] && B.x>=0 && B.x<l && B.y>=0 && B.y<r 
			   && B.z>=0 && B.z<c)
   			{
  				vis[B.x][B.y][B.z]=true;
  				B.n=A.n+1;
  				if(B.x==E.x && B.y==E.y && B.z==E.z) return B.n;
  				q[rear++]=B;
   			}
		}
	}
	return 0;
}


int main()
{
#ifndef ONLINE_JUDGE
    freopen("532.txt","r",stdin);
#endif
	Point S;
	while(scanf("%d%d%d",&l,&r,&c)==3 && l)
	{
		int i,j,k;
		char s[maxn];
		for(i=0;i<l;i++)
			for(j=0;j<r;j++)
	  		{
	  			scanf("%s",s);
	  			for(k=0;k<c;k++)
	  			  if(s[k]=='#')  mat[i][j][k]=1;
	  			  else
			      {
				  	mat[i][j][k]=0;
				  	if(s[k]=='S')
				  	{
				  		S.x=i;
				  		S.y=j;
				  		S.z=k;
				  	}
				  	else if(s[k]=='E')
				  	{
				  		E.x=i;
				  		E.y=j;
				  		E.z=k;
				  	}
			      }
	  		}
 		/*for(i=0;i<l;i++)
 		{
		  for(j=0;j<r;j++)
		  {
		  	 for(k=0;k<c;k++)  printf("%d",mat[i][j][k]);
			 printf("\n");	
		  }
	      printf("\n");
 		}*/
 		int ans=bfs(S);
 		if(ans)  printf("Escaped in %d minute(s).\n",ans);
 		else printf("Trapped!\n");
	}
    return 0;
}



二:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
const int maxn=40;

struct Point
{
	int x,y,z;
};

Point q[maxn*maxn*maxn],E;
int dir[6][3]={{0,1,0},{0,-1,0},{0,0,1},{0,0,-1},{1,0,0},{-1,0,0}};
int l,r,c;
int mat[maxn][maxn][maxn];
int dist[maxn][maxn][maxn];
bool vis[maxn][maxn][maxn];

int bfs(Point A)
{
	memset(vis,0,sizeof(vis));
	memset(dist,0,sizeof(dist));
	vis[A.x][A.y][A.z]=true;
	int front=0,rear=0,d;
	q[rear++]=A;
	while(front<rear)
	{
		A=q[front++];
		for(d=0;d<6;d++)
		{
			Point B;
			B.x=A.x+dir[d][0];
			B.y=A.y+dir[d][1];
			B.z=A.z+dir[d][2];
			if(!mat[B.x][B.y][B.z] && !vis[B.x][B.y][B.z] 
			&& B.x>=0 && B.x<l && B.y>=0 && B.y<r 
			   && B.z>=0 && B.z<c)
   			{
  				vis[B.x][B.y][B.z]=true;
  				if(dist[B.x][B.y][B.z]==0)  
				   dist[B.x][B.y][B.z]=dist[A.x][A.y][A.z]+1;
  				if(B.x==E.x && B.y==E.y && B.z==E.z) return dist[B.x][B.y][B.z];
  				q[rear++]=B;
   			}
		}
	}
	return 0;
}


int main()
{
#ifndef ONLINE_JUDGE
    freopen("532.txt","r",stdin);
#endif
	Point S;
	while(scanf("%d%d%d",&l,&r,&c)==3 && l)
	{
		int i,j,k,x1,y1,z1,x2,y2,z2;
		char s[maxn];
		for(i=0;i<l;i++)
			for(j=0;j<r;j++)
	  		{
	  			scanf("%s",s);
	  			for(k=0;k<c;k++)
	  			  if(s[k]=='#')  mat[i][j][k]=1;
	  			  else
			      {
				  	mat[i][j][k]=0;
				  	if(s[k]=='S')
				  	{
				  		S.x=i;
				  		S.y=j;
				  		S.z=k;
				  	}
				  	else if(s[k]=='E')
				  	{
				  		E.x=i;
				  		E.y=j;
				  		E.z=k;
				  	}
			      }
	  		}
 		/*for(i=0;i<l;i++)
 		{
		  for(j=0;j<r;j++)
		  {
		  	 for(k=0;k<c;k++)  printf("%d",mat[i][j][k]);
			 printf("\n");	
		  }
	      printf("\n");
 		}*/
 		int ans=bfs(S);
 		if(ans)  printf("Escaped in %d minute(s).\n",ans);
 		else printf("Trapped!\n");
	}
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值