uva 532 - Dungeon Master
2012-01-23 16:14
344 查看
方法一:结构体中增加一个记录时间的项。
方法二:增加一个数组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; }
相关文章推荐
- UVA 532 - Dungeon Master
- uva 532 - Dungeon Master
- uva 532 Dungeon Master
- UVA 532 Dungeon Master
- UVA 532 - Dungeon Master
- UVA 532 - Dungeon Master
- UVA - 532 Dungeon Master
- UVA 532 - Dungeon Master
- uva 532 Dungeon Master
- uva 532 - Dungeon Master
- uva532 - Dungeon Master
- UVa 532 Dungeon Master( BFS )
- UVA 532-Dungeon Master
- UVA 532- Dungeon Master(三维bfs)
- UVA532 - Dungeon Master(裸BFS)
- UVA 532 Dungeon Master
- Dungeon Master - UVa 532 搜索
- uva 532 Dungeon Master —— BFS(求最短路)
- UVA 532--Dungeon Master
- UVa 532 Dungeon Master