方法一:结构体中增加一个记录时间的项。
方法二:增加一个数组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;
}