http://poj.org/problem?id=1475(Pushing Boxes)

bfs 嵌套 bfs 先對箱子bfs 再對人bfs是否能達到。
#include <iostream>
using namespace std;
#include <cstdio>
#include <queue>
#include <cstring>
#include <string>
struct point{
 int sx,sy,bx,by;
 string s;
}p,pp,t,tt;
char map[25][25],di1[4]={'N','S','E','W'},di2[4]={'n','s','e','w'};
int b[25][25],c[25][25],d[4][2]={{-1,0},{1,0},{0,1},{0,-1}},sx,sy,bx,by,ex,ey,n,m;
int bfs2(int x,int y,int x1,int y1)
{
 int i,j,k;
 memset(c,0,sizeof(c));
c[x][y]=1; c[p.bx][p.by]=1;
  pp.sx=x,pp.sy=y; pp.s=t.s="";
 if(x==x1&&y==y1) return 1;
 queue <point> q;
 q.push(pp);
 while(!q.empty())
 {
  pp=q.front(); q.pop();
     for(i=0;i<4;i++)
     {
      j=pp.sx+d[i][0],k=pp.sy+d[i][1];
      if(j>=0&&j<n&&k>=0&&k<m&&map[j][k]!='#'&&c[j][k]==0)
      {
       c[j][k]=1; t.sx=j, t.sy=k;
       t.s=pp.s+di2[i];
       if(j==x1&&k==y1) return 1;
       q.push(t);
      }
     }
 }
 return 0;
}
int bfs1()
{
 int i,j,k,j1,k1;
 memset(b,0,sizeof(b));
 queue <point> q;
 p.sx=sx,p.sy=sy,p.bx=bx,p.by=by;p.s="";
 b[bx][by]=1; q.push(p);
 while(!q.empty())
 {
  p=q.front(); q.pop();
  for(i=0;i<4;i++)
  {
   j=p.bx-d[i][0]; k=p.by-d[i][1];
   if(j>=0&&j<n&&k>=0&&k<m&&map[j][k]!='#'&&bfs2(p.sx,p.sy,j,k))
   {
    j1=p.bx+d[i][0]; k1=p.by+d[i][1];
    if(j1>=0&&j1<n&&k1>=0&&k1<m&&map[j1][k1]!='#'&&b[j1][k1]==0)
    {
     b[j1][k1]=1;
     tt.sx=p.bx,tt.sy=p.by;tt.bx=j1,tt.by=k1;
     tt.s=p.s+t.s+di1[i];
     if(j1==ex&&k1==ey) return 1;
     q.push(tt);
    }
   }
   } 
  }
 return 0;
}
int main(int argc, char *argv[])
{
 int i,j,k,s=0;
 while(cin>>n>>m&&(n||m))
 {
  for(i=0;i<n;i++)
  for(j=0;j<m;j++)
  {
  cin>>map[i][j];
  if(map[i][j]=='S') sx=i,sy=j;
  if(map[i][j]=='B') bx=i,by=j;
  if(map[i][j]=='T') ex=i,ey=j;
  }
  if(bfs1()) cout<<"Maze #"<<++s<<endl<<tt.s<<endl<<endl;
  else cout<<"Maze #"<<++s<<endl<<"Impossible."<<endl<<endl;
 }
 return 0;
}

發佈了54 篇原創文章 · 獲贊 2 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章