poj 1475 嵌套bfs

#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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值