您的位置:首页 > 其它

poj 1475 嵌套bfs

2017-01-19 13:08 387 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: