#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;
}
http://poj.org/problem?id=1475(Pushing Boxes)
bfs 嵌套 bfs 先對箱子bfs 再對人bfs是否能達到。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.