poj2251-----BFS模板题

就是在二维bfs的基础上,再添加两个方向。无他

呵呵,学了STL,用<queue>超方便啊!好爽,要继续发扬光大

AC:

#include<iostream>
#include<queue>
#include<cstring>
#include<cstdio>
using namespace std;
char map[50][50][50];
int flag[50][50][50];               //0没有走过,1代表走过
int fanx[6]={1,-1,0,0,0,0};
int fany[6]={0,0,1,-1,0,0};
int fanz[6]={0,0,0,0,1,-1};

int result;
int bx,by,bz;
int sx,sy,sz;
int n,m,l;                //n层,    每层 m行,l列
struct node
{
 int x;
 int y;
 int z;
 int step;
};


int bfs()
{
 queue<node> qu;
 node p,temp;
 p.x=bx;
 p.y=by;
 p.z=bz;
 p.step=0;
 map[p.x][p.y][p.z]='#';              //表示这个点已经访问过了,以后不会再访问了
 qu.push(p);
 while(!qu.empty())
 {
  p=qu.front();
  qu.pop();
  if(p.x==sx&&p.y==sy&&p.z==sz)
  {
   //printf("到此时的步数位%d\n",p.step);
    return p.step;
  }
  for(int i=0;i<6;i++)
  {
   temp.x=p.x+fanx[i];
   temp.y=p.y+fany[i];
   temp.z=p.z+fanz[i];
   
   if(temp.x>=0&&temp.x<n&&temp.y>=0&&temp.y<m&&temp.z>=0&&temp.z<l&&map[temp.x][temp.y][temp.z]!='#')
   {
    temp.step=p.step+1;
    map[temp.x][temp.y][temp.z]='#';
    qu.push(temp);
   }
  }
 }
 return 0;

int main()
{
 int i,j,k;
 while(cin>>n>>m>>l&&n&&m&&l)
 {
  for(i=0;i<n;i++)
  {
   for(j=0;j<m;j++)
   {
    cin>>map[i][j];
    for(k=0;k<l;k++)
    {
     if(map[i][j][k]=='S')
     {
      bx=i;
      by=j;
      bz=k;
     }
     if(map[i][j][k]=='E')
     {
      sx=i;
      sy=j;
      sz=k;
     }
    }
   }
  }
  i=bfs();
  //cout<<"结果是"<<i<<endl;
  if(i==0)
  cout<<"Trapped!"<<endl;
  else
  cout<<"Escaped in "<<i<<" minute(s)."<<endl;
 }
 return 0;
}

posted on 2012-03-23 20:43  hrbust_09zhangyabin  阅读(374)  评论(0编辑  收藏  举报