BFS和队列例题

来源:互联网 发布:井泵电机数据 编辑:程序博客网 时间:2024/05/18 00:04
poj2251Dungeon Master

最简单的BFS求最短距离,只是改一下方向数组就可以,二维数组改为三维数组

下面是AC代码

对了,下面用的c++队列,其实很简单,就只有几种操作:

先介绍队列的定义   queue<类型名>变量名,如

queue<int>q,queue或queue<node>que;(struct node(结构体类型));

1、 q.front()      取出队首元素

2、   q.empty()    判断是否为空,时空返回1

3、   q.pop()       删除队首元素

4、   q.push(变量)加入变量      

复制代码
 1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<queue> 5 #include<string> 6 #include<stack> 7 #include<cmath> 8 #include<cctype> 9 #include<iostream>10 #include<set>11 #include<algorithm>12 #include<ctime>13 #include<vector>14 using namespace std;15 #define mem(a) memset(a,0,sizeof(a))16 #define MAXN 100000000717 #define judge(x,y,z) !vis[x][y][z]&&map[x][y][z]!='#'&&x>=0&&x<l&&y>=0&&y<m&&z>=0&&z<n18 int d[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};19 bool vis[35][35][35];20 char map[35][35][35];21 int l,m,n;22 struct node23 {24     int x,y,z;25     int step;26 };27 int  BFS(int x,int y,int z)28 {29     mem(vis);30     queue<node>q;31     node u;32     u.x=x;u.y=y;u.z=z;33     u.step=0;34     q.push(u);35     while(!q.empty())36     {37         u=q.front();38         if(map[u.x][u.y][u.z]=='E')return u.step;39         q.pop();40         int i;41         for(i=0;i<6;i++)42         {43             node v;44             v.x=u.x+d[i][0];v.y=u.y+d[i][1];45             v.z=u.z+d[i][2];46             if(judge(v.x,v.y,v.z))47             {48                 vis[v.x][v.y][v.z]=true;49                 v.step=u.step+1;50                 q.push(v);51             }52         }53     }54     return 0;55 }56 int main()57 {58     while(~scanf("%d%d%d%*c",&l,&m,&n))59     {60         mem(map);61         if(!m&&!n&&!l)break;62         int i,j,k,sx,sy,sz;63         for(i=0;i<l;i++)64             for(j=0;j<m;j++){65                 scanf("%s",map[i][j]);66                 for(k=0;k<n;k++)67                 {68                     if(map[i][j][k]=='S')sx=i,sy=j,sz=k;69                 }70             }71         int step=BFS(sx,sy,sz);72         if(step)printf("Escaped in %d minute(s).\n",step);73         else printf("Trapped!\n");74     }75     return 0;76 }

0 0
原创粉丝点击