标签:
题目链接:http://poj.org/problem?id=2251
题目大意:三维迷宫求两点间最短路。
解题思路:bfs搜索。
用一个三维数组maze记录迷宫的每一点是否可走。
用一个三维数组标记每一点是否已经走过。
用一个一维数组模拟队列的实现过程。
将起点放在队首,然后向六个方向扩展,若可行,则把该点放在队首,并抛弃队首成员。
如果当前点为终点,则记录下此时花费的时间,并返回。
代码如下:
1 #include<cstdio> 2 #include<cstring> 3 #define MAXN 35 4 5 bool maze[MAXN][MAXN][MAXN];//记录该点是否可走 6 bool vis [MAXN][MAXN][MAXN];//记录该点是否已经走过 7 int l,r,c,res; 8 struct Point//描述一个点 9 { 10 int l,r,c,cost; 11 }; 12 Point s,e;//起点和终点 13 Point Queue[MAXN*MAXN*MAXN];//模拟队列的实现 14 15 bool bfs(int l,int r,int c) 16 { 17 memset(vis,0,sizeof(vis));//初始化,全部未走过 18 19 int head=0,tail=1;//队首,队尾 20 21 //描述队首 22 Queue[0].l=l; 23 Queue[0].r=r; 24 Queue[0].c=c; 25 Queue[0].cost=0; 26 vis[l][r][c]=true;//已经走过了该点 27 28 while(head<tail) 29 { 30 Point x=Queue[head++];//从队首拿出一点 31 32 if(x.l==e.l && x.r==e.r && x.c==e.c)//如果该点是终点,结束搜索 33 { 34 res=x.cost; 35 return true; 36 } 37 38 if(maze[x.l][x.r][x.c-1]==1 && vis[x.l][x.r][x.c-1]==0)//向西扩展 39 { 40 vis[x.l][x.r][x.c-1]=true; 41 Queue[tail].l=x.l; 42 Queue[tail].r=x.r; 43 Queue[tail].c=x.c-1; 44 Queue[tail++].cost=x.cost+1; 45 } 46 if(maze[x.l][x.r][x.c+1]==1 && vis[x.l][x.r][x.c+1]==0)//向东扩展 47 { 48 vis[x.l][x.r][x.c+1]=true; 49 Queue[tail].l=x.l; 50 Queue[tail].r=x.r; 51 Queue[tail].c=x.c+1; 52 Queue[tail++].cost=x.cost+1; 53 } 54 if(maze[x.l][x.r-1][x.c]==1 && vis[x.l][x.r-1][x.c]==0)//向北扩展 55 { 56 vis[x.l][x.r-1][x.c]=true; 57 Queue[tail].l=x.l; 58 Queue[tail].r=x.r-1; 59 Queue[tail].c=x.c; 60 Queue[tail++].cost=x.cost+1; 61 } 62 if(maze[x.l][x.r+1][x.c]==1 && vis[x.l][x.r+1][x.c]==0)//向南扩展 63 { 64 vis[x.l][x.r+1][x.c]=true; 65 Queue[tail].l=x.l; 66 Queue[tail].r=x.r+1; 67 Queue[tail].c=x.c; 68 Queue[tail++].cost=x.cost+1; 69 } 70 if(maze[x.l-1][x.r][x.c]==1 && vis[x.l-1][x.r][x.c]==0)//向下扩展 71 { 72 vis[x.l-1][x.r][x.c]=true; 73 Queue[tail].l=x.l-1; 74 Queue[tail].r=x.r; 75 Queue[tail].c=x.c; 76 Queue[tail++].cost=x.cost+1; 77 } 78 if(maze[x.l+1][x.r][x.c]==1 && vis[x.l+1][x.r][x.c]==0)//向上扩展 79 { 80 vis[x.l+1][x.r][x.c]=true; 81 Queue[tail].l=x.l+1; 82 Queue[tail].r=x.r; 83 Queue[tail].c=x.c; 84 Queue[tail++].cost=x.cost+1; 85 } 86 } 87 return false; 88 } 89 90 int main() 91 { 92 while(scanf("%d %d %d",&l,&r,&c)!=EOF) 93 { 94 getchar(); 95 if(l==0 && r==0 && c==0) break; 96 97 memset(maze,0,sizeof(maze));//初始化迷宫,认为每点都是不可走的 98 for(int k=0;k<l;k++) 99 { 100 for(int i=0;i<r;i++) 101 { 102 for(int j=0;j<c;j++) 103 { 104 char temp; 105 scanf("%c",&temp); 106 if(temp==‘S‘) 107 { 108 s.l=k; 109 s.r=i; 110 s.c=j; 111 maze[k][i][j]=true; 112 } 113 else if(temp==‘E‘) 114 { 115 e.l=k; 116 e.r=i; 117 e.c=j; 118 maze[k][i][j]=true; 119 } 120 else if(temp==‘.‘) 121 { 122 maze[k][i][j]=true; 123 } 124 } 125 getchar(); 126 } 127 getchar(); 128 } 129 130 if(bfs(s.l,s.r,s.c)==true) 131 printf("Escaped in %d minute(s).\n",res); 132 else 133 printf("Trapped!\n"); 134 } 135 return 0; 136 }
标签:
原文地址:http://www.cnblogs.com/Page3/p/4641881.html