标签:des style blog http color width
Description

Input
Output
Sample Input
1 7 SB....T 1 7 SB..#.T 7 11 ########### #T##......# #.#.#..#### #....B....# #.######..# #.....S...# ########### 8 4 .... .##. .#.. .#.. .#.B .##S .... ###T 0 0
Sample Output
Maze #1 EEEEE Maze #2 Impossible. Maze #3 eennwwWWWWeeeeeesswwwwwwwnNN Maze #4 swwwnnnnnneeesssSSS
思路:用一个四维数组分别记录箱子和人的位置,son数组记录上一个节点,用优先队列让推的次数最小的先出队,递归输出路径。
#include <cstdio>
#include <queue>
using namespace std;
struct S{
int x,y,bx,by,id,pcnt,acnt;
friend bool operator<(struct S a,struct S b);
}t;
bool operator<(struct S a,struct S b)
{
if(a.pcnt!=b.pcnt) return a.pcnt>b.pcnt;
else return a.acnt>b.acnt;
}
priority_queue<struct S>que;
char mp[20][21];
bool vis[20][20][20][20];
int nxt[4][2]={{0,1},{1,0},{0,-1},{-1,0}},val[1000000],son[1000000],idx;
void dfs(int x)
{
if(son[x]!=-1)
{
dfs(son[x]);
printf("%c",val[x]);
}
}
int main()
{
int n,m,i,j,p,q,ex,ey,casenum=1;
while(~scanf("%d%d",&n,&m) && n)
{
printf("Maze #%d\n",casenum++);
for(i=0;i<n;i++) scanf("%s",mp[i]);
for(i=0;i<n;i++) for(j=0;j<m;j++) for(p=0;p<n;p++) for(q=0;q<m;q++) vis[i][j][p][q]=0;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(mp[i][j]=='S') mp[i][j]='.',t.x=i,t.y=j;
if(mp[i][j]=='B') mp[i][j]='.',t.bx=i,t.by=j;
if(mp[i][j]=='T') mp[i][j]='.',ex=i,ey=j;
}
}
vis[t.x][t.y][t.bx][t.by]=1;
idx=1;
t.id=0;
son[0]=-1;
t.pcnt=0;
t.acnt=0;
while(!que.empty()) que.pop();
que.push(t);
while(!que.empty())
{
t=que.top();
if(t.bx==ex && t.by==ey)
{
dfs(t.id);
printf("\n");
break;
}
for(i=0;i<4;i++)
{
t.x+=nxt[i][0];
t.y+=nxt[i][1];
if(t.x>=0 && t.x<n && t.y>=0 && t.y<m && mp[t.x][t.y]=='.')
{
if(t.x==t.bx && t.y==t.by)//推箱子
{
t.bx+=nxt[i][0];
t.by+=nxt[i][1];
if(t.bx>=0 && t.bx<n && t.by>=0 && t.by<m && mp[t.bx][t.by]=='.')
{
if(!vis[t.x][t.y][t.bx][t.by])
{
vis[t.x][t.y][t.bx][t.by]=1;
int oldid=t.id;
son[idx]=t.id;
t.id=idx;
t.pcnt++;
t.acnt++;
if(i==0) val[idx]='E';
if(i==1) val[idx]='S';
if(i==2) val[idx]='W';
if(i==3) val[idx]='N';
que.push(t);
t.pcnt--;
t.acnt--;
idx++;
t.id=oldid;
}
}
t.bx-=nxt[i][0];
t.by-=nxt[i][1];
}
else//不推箱子
{
if(!vis[t.x][t.y][t.bx][t.by])
{
vis[t.x][t.y][t.bx][t.by]=1;
int oldid=t.id;
son[idx]=t.id;
t.id=idx;
t.acnt++;
if(i==0) val[idx]='e';
if(i==1) val[idx]='s';
if(i==2) val[idx]='w';
if(i==3) val[idx]='n';
que.push(t);
t.acnt--;
idx++;
t.id=oldid;
}
}
}
t.x-=nxt[i][0];
t.y-=nxt[i][1];
}
que.pop();
}
if(que.empty()) printf("Impossible.\n");
printf("\n");
}
}POJ-1475-Pushing Boxes(BFS),布布扣,bubuko.com
标签:des style blog http color width
原文地址:http://blog.csdn.net/faithdmc/article/details/37293679