-
题意:有一个三维的图,问能否从起点走到终点,若能,输出最小步数.
-
题解:应该是个bfs模板题,但是第一次写到三维图的题目,注意开三维数组存图,然后遍历方向的时候记得向z轴上下跑两个就行了.
-
代码:
struct misaka{ int x,y,z; }e; int l,r,c; char s[100][100][100]; int dis[100][100][100]; int sx,sy,sz,ex,ey,ez; int dx[6]={0,1,0,-1,0,0},dy[6]={1,0,-1,0,0,0},dz[6]={0,0,0,0,1,-1}; int bfs(){ queue<misaka> q; q.push({sx,sy,sz}); while(!q.empty()){ misaka tmp=q.front(); q.pop(); int x=tmp.x; int y=tmp.y; int z=tmp.z; if(x==ex && y==ey && z==ez) break; for(int i=0;i<6;++i){ int tx=x+dx[i]; int ty=y+dy[i]; int tz=z+dz[i]; if(tx>=0 && tx<l && ty>=0 && ty<r && tz>=0 && tz<c && (s[tx][ty][tz]=='.' || s[tx][ty][tz]=='E') && dis[tx][ty][tz]==INF){ dis[tx][ty][tz]=dis[x][y][z]+1; q.push({tx,ty,tz}); } } } return dis[ex][ey][ez]; } int main() { //ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); while(scanf("%d %d %d",&l,&r,&c)){ if(l==0 && r==0 && c==0) break; for(int i=0;i<l;++i){ for(int j=0;j<r;++j){ scanf("%s",s[i][j]); for(int k=0;k<c;++k){ dis[i][j][k]=INF; if(s[i][j][k]=='S'){ dis[i][j][k]=0; sx=i; sy=j; sz=k; } else if(s[i][j][k]=='E'){ ex=i; ey=j; ez=k; } } } } int res=bfs(); if(res==INF) puts("Trapped!"); else printf("Escaped in %d minute(s).\n",res); } return 0; }
相关文章
- 12-28【POJ 2251】Dungeon Master(bfs)
- 12-28【POJ - 2251】Dungeon Master (bfs+优先队列)
- 12-28E - Dungeon Master BFS
- 12-28POJ-2251 Dungeon Master
- 12-28POJ-2251 Dungeon Master (三维BFS)
- 12-28Dungeon Master 地下城大师(BFS进阶)
- 12-28UVA532 Dungeon Master(三维BFS)
- 12-28简单搜索(BFS广搜/DFS)Dungeon Master POJ - 2251 题解
- 12-28POJ-2251 Dungeon Master(三维搜索bfs)
- 12-28(POJ - 2251)Dungeon Master(bfs)