主要解决的问题有两个:
1.如何走到你可以推箱子的方格中
2.如何将箱子推到目标方格中
#include<cstdio>
#include<queue>
#include<cstring>
#include<iostream>
#include<string>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn=25;
char map[maxn][maxn];
bool visp[maxn][maxn];
bool visb[maxn][maxn];
int r,c;
int dir[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
char push[4]={'E','W','N','S'};
char walk[4]={'e','w','n','s'};
string path;
struct NODE{
int pr,pc;
int br,bc;
string ans;
};
inline bool inmap(int tr,int tc){
return (tr>=1&&tc>=1&&tr<=r&&tc<=c);
}
bool bfs2(int sr,int sc,int er,int ec,int br,int bc,string & str){
memset(visp,0,sizeof(visp));
queue<NODE> q;
NODE node,tnode;
node.pr=sr,node.pc=sc,node.ans="";
q.push(node);
visp[br][bc]=1;
while(!q.empty()){
node=q.front();q.pop();
if(node.pr==er&&node.pc==ec){
str=node.ans;
return 1;
}
if(visp[node.pr][node.pc]) continue;
visp[node.pr][node.pc]=1;
for(int i=0;i<4;i++){
int nr=node.pr+dir[i][0];
int nc=node.pc+dir[i][1];
if(inmap(nr,nc)&&!visp[nr][nc]&&map[nr][nc]!='#'){
tnode.pr=nr;
tnode.pc=nc;
tnode.ans=node.ans+walk[i];
q.push(tnode);
}
}
}
return false;
}
bool bfs1(int sr,int sc,int nr,int nc){
// 我的位置s,箱子的位置n
memset(visb,0,sizeof(visb));
queue<NODE> q;
NODE node,tnode;
node.pr=sr,node.pc=sc,node.br=nr,node.bc=nc,node.ans="";
q.push(node);
while(!q.empty()){
node=q.front();q.pop();
if(visb[node.br][node.bc]) continue;
visb[node.br][node.bc]=1;
if(map[node.br][node.bc]=='T') {
path=node.ans;
return 1;
}
for(int i=0;i<4;i++){
int nextr=node.br+dir[i][0],nextc=node.bc+dir[i][1];
int backr=node.br-dir[i][0],backc=node.bc-dir[i][1];
string str="";
if(inmap(nextr,nextc)&&inmap(backr,backc)&&map[nextr][nextc]!='#'&&map[backr][backc]!='#'&&!visb[nextr][nextc]){
if(bfs2(node.pr,node.pc,backr,backc,node.br,node.bc,str)){
tnode.pr=node.br,tnode.pc=node.bc;
tnode.br=nextr,tnode.bc=nextc;
tnode.ans=node.ans+str+push[i];
q.push(tnode);
}
}
}
}
return 0;
}
int main(){
int sr,sc,br,bc;
int cs=1;
while(cin>>r>>c&&(r||c)){
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++){
cin>>map[i][j];
if(map[i][j]=='S') sr=i,sc=j;
if(map[i][j]=='B') br=i,bc=j;
}
}
path="";
cout<<"Maze #"<<cs++<<endl;
if(bfs1(sr,sc,br,bc)){
cout<<path<<endl;
}else{
cout<<"Impossible."<<endl;
}
cout<<endl;
}
return 0;
}