poj 1475 嵌套bfs

来源:互联网 发布:js判断网址是否存在 编辑:程序博客网 时间:2024/06/14 03:57
#include<iostream>#include<cstdio>#include<cstring>#include<queue>#include<string>using namespace std;int sx,sy,bx,by,tx,ty,r,c,psx,psy,pex,pey,vis_person[25][25],vis_box[25][25],cas;int help[4][2]={0,1,0,-1,1,0,-1,0};char walk[4]={'e','w','s','n'};char push[4]={'E','W','S','N'};typedef struct{    int person_x,person_y,box_x,box_y;    string now;} status;struct node{    int sx,sy;    string now;};char map[25][25];bool check(int i,int j){    if(i>=0&&i<r&&j>=0&&j<c&&map[i][j]!='#')        return true;    return false;}string bfs_person(){    memset(vis_person,0,sizeof(vis_person));    node st;    st.sx=psx,st.sy=psy,st.now="";    queue<node> que;    que.push(st);    while(que.size())    {        node temp=que.front();        que.pop();        if(temp.sx==pex&&temp.sy==pey) return temp.now;        for(int i=0;i<4;i++)        {            node tp=temp;            tp.sx+=help[i][0],tp.sy+=help[i][1];            if(!check(tp.sx,tp.sy)) continue;            if(tp.sx==bx&&tp.sy==by) continue;            if(vis_person[tp.sx][tp.sy]) continue;            tp.now+=walk[i];            que.push(tp);            vis_person[tp.sx][tp.sy]=1;        }    }    return "23333";}void bfs_box(){    printf("Maze #%d\n",++cas);    memset(vis_box,0,sizeof(vis_box));    status st;    st.box_x=bx,st.box_y=by,st.person_x=sx,st.person_y=sy,st.now="";    queue<status> que;    que.push(st);    while(que.size())    {        status now_status=que.front();        que.pop();        if(now_status.box_x==tx&&now_status.box_y==ty)        {            cout<<now_status.now<<endl;            printf("\n");            return;        }        for(int i=0;i<4;i++)        {            bx=now_status.box_x,by=now_status.box_y;            psx=now_status.person_x,psy=now_status.person_y;            pex=now_status.box_x-help[i][0],pey=now_status.box_y-help[i][1];            if(!check(pex,pey)) continue;            int bex=now_status.box_x+help[i][0],bey=now_status.box_y+help[i][1];            if(!check(bex,bey)) continue;            if(vis_box[bex][bey]) continue;            string tptp=bfs_person();            if(tptp=="23333") continue;            status hehe;            hehe.box_x=bex,hehe.box_y=bey;            hehe.person_x=now_status.box_x,hehe.person_y=now_status.box_y;            hehe.now=now_status.now+tptp+push[i];            que.push(hehe);            vis_box[bex][bey]=1;        }    }    printf("Impossible.\n\n");}int main(){    while(scanf("%d%d",&r,&c)!=EOF&&(r||c))    {        for(int i=0;i<r;i++)        {            scanf("%s",map[i]);            for(int j=0;j<c;j++)                if(map[i][j]=='S')                    sx=i,sy=j;                else if(map[i][j]=='B')                    bx=i,by=j;                else if(map[i][j]=='T')                    tx=i,ty=j;        }        bfs_box();    }    return 0;}

0 0
原创粉丝点击