标签:escape class bfs pre nod 记录 names sum alt
【题意】::士兵X要以最快的速度解救公主E(即路径最短),每运动一次时间增加一分钟;问公主是否能被解救,能则输出时间,不能则输出"Impossible";
【思路】::此题最大的难点在于三维空间,我开始没读懂题呢。一个3D的立体图形(类似于长方体),求在此条件下的最短路径,比平常做的平面多了一维,用普通的bfs求解即可。
#include<iostream> #include<cstdio> #include<queue> #include<cstring> #include<string> using namespace std; char mp[35][35][35]; int vis[35][35][35]; int l,r,c; //3D空间,所以有六个方向。标记 int fx[6]={0,0,0,0,-1,1}; int fy[6]={0,-1,0,1,0,0}; int fz[6]={1,0,-1,0,0,0}; int answer; struct node { int x,y,z; int sum;//记录步数 }; //node e,now; bool check(int x,int y,int z){ if(x<l&&x>=0&&y<r&&y>=0&&z<c&&z>=0&&mp[x][y][z]!=‘#‘){ //printf("%d %d %d++++++\n",x,y,z); return 1; } return 0; } int bfs(int x,int y,int z){ queue<node> q; node now; q.push({x,y,z}); now.sum=0; while(q.size()){ now=q.front(); q.pop(); if(mp[now.x][now.y][now.z]==‘E‘){ return now.sum; } for(int i=0;i<6;i++){ node e;//对下一个进行标记 e.x=now.x+fx[i]; e.y=now.y+fy[i]; e.z=now.z+fz[i]; if(!vis[e.x][e.y][e.z]&&check(e.x,e.y,e.z)){//表示有路可走 vis[e.x][e.y][e.z]=1; e.sum=now.sum+1; q.push(e); } } } return -1; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); int i,j,k; int si,sj,sk; while (cin>>l>>r>>c&&(l!=0||r!=0||c!=0)) { memset(vis,0,sizeof(vis)); for (i=0;i<l;i++) for (j=0;j<r;j++) for (k=0;k<c;k++) { cin>>mp[i][j][k]; if (mp[i][j][k]==‘S‘)//记录当前士兵的位置 { si=i; sj=j; sk=k; } } answer=bfs(si,sj,sk); if (answer==-1) cout << "Trapped!" << endl; else cout << "Escaped in " << answer << " minute(s)." << endl; } return 0; }
以上就是我的做法了,由于是新手,所以看到这道题我还是做了很久,但大体代码都是直接照搬模板的。。。
标签:escape class bfs pre nod 记录 names sum alt
原文地址:https://www.cnblogs.com/WGD943/p/12229471.html