POJ 1475 (双重BFS)

 主要解决的问题有两个:

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;
}

猜你喜欢

转载自blog.csdn.net/qq_40679299/article/details/81201289