http://poj.org/problem?id=2251 题意:给定三维的格子、起点和终点 问最小几步 能到 不能输出-1. 分析:简单的BFS 数据量不大。 不过代码写的很搓……。 #include <stdio.h> #include <string.h> const int N=35; bool map[N][N][N]; int g[N][N][N]; int L,R,C; struct point { int x,y,z; }stu[30000]; struct point start,end; void bfs(void) { int r=0,l=1; stu[0].x=start.x; stu[0].y=start.y; stu[0].z=start.z; while(r<l) { if(map[stu[r].x][stu[r].y][stu[r].z-1] == true) { if( g[stu[r].x][stu[r].y][stu[r].z]+1 < g[stu[r].x][stu[r].y][stu[r].z-1]) { g[stu[r].x][stu[r].y][stu[r].z-1] = g[stu[r].x][stu[r].y][stu[r].z]+1; stu[l].x=stu[r].x; stu[l].y=stu[r].y; stu[l].z=stu[r].z-1; l++; } } if(map[stu[r].x-1][stu[r].y][stu[r].z] == true) { if( g[stu[r].x][stu[r].y][stu[r].z]+1 < g[stu[r].x-1][stu[r].y][stu[r].z]) { g[stu[r].x-1][stu[r].y][stu[r].z] = g[stu[r].x][stu[r].y][stu[r].z]+1; stu[l].x=stu[r].x-1; stu[l].y=stu[r].y; stu[l].z=stu[r].z; l++; } } if(map[stu[r].x+1][stu[r].y][stu[r].z] == true) { if( g[stu[r].x][stu[r].y][stu[r].z]+1 < g[stu[r].x+1][stu[r].y][stu[r].z]) { g[stu[r].x+1][stu[r].y][stu[r].z] = g[stu[r].x][stu[r].y][stu[r].z]+1; stu[l].x=stu[r].x+1; stu[l].y=stu[r].y; stu[l].z=stu[r].z; l++; } } if(map[stu[r].x][stu[r].y-1][stu[r].z] == true) { if( g[stu[r].x][stu[r].y][stu[r].z]+1 < g[stu[r].x][stu[r].y-1][stu[r].z]) { g[stu[r].x][stu[r].y-1][stu[r].z] = g[stu[r].x][stu[r].y][stu[r].z]+1; stu[l].x=stu[r].x; stu[l].y=stu[r].y-1; stu[l].z=stu[r].z; l++; } } if(map[stu[r].x][stu[r].y+1][stu[r].z] == true) { if( g[stu[r].x][stu[r].y][stu[r].z]+1 < g[stu[r].x][stu[r].y+1][stu[r].z]) { g[stu[r].x][stu[r].y+1][stu[r].z] = g[stu[r].x][stu[r].y][stu[r].z]+1; stu[l].x=stu[r].x; stu[l].y=stu[r].y+1; stu[l].z=stu[r].z; l++; } } if(map[stu[r].x][stu[r].y][stu[r].z+1] == true) { if( g[stu[r].x][stu[r].y][stu[r].z]+1 < g[stu[r].x][stu[r].y][stu[r].z+1]) { g[stu[r].x][stu[r].y][stu[r].z+1] = g[stu[r].x][stu[r].y][stu[r].z]+1; stu[l].x=stu[r].x; stu[l].y=stu[r].y; stu[l].z=stu[r].z+1; l++; } } r++; } } int main() { while(scanf("%d%d%d",&L,&R,&C)!=EOF) { if(L ==0 && R == 0 && C == 0) break; char ch; getchar(); memset(map,false,sizeof(map));//标记不能访问 memset(g,0x3f,sizeof(g)); memset(stu,0,sizeof(stu)); for(int i=1; i<=L; i++) { for(int j=1;j<=R;j++) { for(int k=1;k<=C;k++) { scanf("%c",&ch); if(ch == 'S') { start.x=j;start.y=k;start.z=i; g[j][k][i]=0; map[j][k][i]=true; } else if(ch == 'E') { end.x=j;end.y=k;end.z=i; map[j][k][i]=true; } else if(ch == '.') map[j][k][i]=true; } getchar(); } if(i!=L) getchar(); } bfs(); if(g[end.x][end.y][end.z] == 0x3f3f3f3f) printf("Trapped!/n"); else printf("Escaped in %d minute(s)./n",g[end.x][end.y][end.z]); } return 0; } 转载请注明地址,谢谢。