POJ 2251三维BFS (求最短时间

    科技2024-08-05  31

    题目链接

    题目大意:

    三维的空间,起始位置是 S  出口在  E   问最短多少时间可以逃出来

    解题思路:

    把二维的 bfs 换成三维  套模板就行

    代码如下:  

    #include<iostream> #include<queue> #include<vector> #include<cstring> using namespace std; char map[55][55][55];//存地图 bool vis[55][55][55];//标记 int d[6][3]={{1,0,0},{-1,0,0},{0,0,1},{0,0,-1},{0,1,0},{0,-1,0}}; int flag;//标记是否到达目标点 int head;//当前指针 int tail; //入队指针 int ans=0;//最小时间 int l,r,c; struct node { int x;//层数 int y;//长度 int z;//宽度 int t;//最小时间 }a[100000]; bool judge(int x,int y,int z) { if(map[x][y][z]=='#'||x<0||x>=l||y<0||y>=r||z<0||z>=c) { return false; } else return true; } void bfs() { while(head<tail) { for(int i=0;i<6;i++) { int xx=a[head].x+d[i][0]; int yy=a[head].y+d[i][1]; int zz=a[head].z+d[i][2]; if(judge(xx,yy,zz)&&vis[xx][yy][zz]==false) { if(map[xx][yy][zz]=='.') { vis[xx][yy][zz]=true; a[tail].x=xx; a[tail].y=yy; a[tail].z=zz; a[tail].t=a[head].t+1; tail++; } if(map[xx][yy][zz]=='E')//到达目的地 { flag=1; ans=a[head].t+1; break; } } } if(flag==1) break; head++;//对后面的点继续扩展 } } int main() { int i,j,k; while(cin>>l>>r>>c) { if(l==0&&r==0&&c==0) break; memset(vis,false,sizeof(vis)); head=tail=ans=0; a[tail].t=0; for(i=0;i<l;i++) for(j=0;j<r;j++) for(k=0;k<c;k++) { cin>>map[i][j][k]; if(map[i][j][k]=='S')//起点入队 { a[tail].x=i; a[tail].y=j; a[tail].z=k; vis[i][j][k]=true; tail++; } } flag=0; bfs(); if(flag==1) cout<<"Escaped in "<<ans<<" minute(s)."<<endl; else cout<<"Trapped!"<<endl; } return 0; }

     

    Processed: 0.010, SQL: 8