标签:
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"); } }
标签:
原文地址:http://www.cnblogs.com/hrhguanli/p/5178288.html