搜索--12

来源:互联网 发布:诺基亚jar软件下载 编辑:程序博客网 时间:2024/06/06 03:28

题目大概:

输入3个数,为立方体的长宽高,再输入立方体中的每个位置的状态,有起点,终点,障碍物,可以通过的地方。计算起点到终点的最少步数。

思路:

建立一个三维的地图,每个点有六种走法。

用广度优先搜索,用队列存储,不断把每个点的六种走法存到队列中,不断寻找终点,计算最少步数。

感想:

与二维的地图差不多,只是改成三维,走的方向多了。

上一个博客忘记说了,每用完一次队列,一定要清空,否则会错误。

代码;

#include <iostream>#include <queue>#include <cstring>using namespace std;int x[6]={1,-1,0,0,0,0},y[6]={0,0,1,-1,0,0},h[6]={0,0,0,0,1,-1};int n,m,k,sum=0,hh[31][31][31];char map[31][31][31];struct point{int xx,yy,z;int j;};point e;queue<point>b;int bfs(point q){q.j=0;    b.push(q);hh[q.xx][q.yy][q.z]=1;    point r,t;    while (!b.empty())    {r=b.front();b.pop();    for(int i=0;i<6;i++)    {t.xx=r.xx+x[i];    t.yy=r.yy+y[i];    t.z=r.z+h[i];    if(t.xx>0&&t.xx<=k&&t.yy>0&&t.yy<=m&&t.z>0&&t.z<=n&&hh[t.xx][t.yy][t.z]==0&&map[t.xx][t.yy][t.z]!='#')    {t.j=r.j+1;if(t.xx==e.xx&&t.yy==e.yy&&t.z==e.z){return t.j;}       hh[t.xx][t.yy][t.z]=1;        b.push(t);    }    }    }    return -1;}int main(){    while(cin>>k>>m>>n){memset(map,0,sizeof(map));    if(n==0&&m==0&&k==0)break;    point q;for(int i=1;i<=k;i++){ for(int j=1;j<=m;j++) {  for(int t=1;t<=n;t++)  {   cin>>map[i][j][t];      if(map[i][j][t]=='S'){    q.xx=i;q.yy=j;q.z=t;      }      if(map[i][j][t]=='E'){          e.xx=i;e.yy=j;e.z=t;      }  } }}memset(hh,0,sizeof(hh));int l=bfs(q);if(l==-1)cout<<"Trapped!"<<endl;elsecout<<"Escaped in "<<l<<" minute(s)."<<endl; while (!b.empty()){b.pop();}}    return 0;}

原创粉丝点击