#include<bits/stdc++.h> #define debu using namespace std; const int dx[]= {0,-1,0,1}; const int dy[]= {-1,0,1,0}; const int d[]= {1,2,4,8}; const char dir[]= {"WNES"}; int stx,sty; int g[10][20]; int v[10][20]; char ans[1000]; int check(int x,int y) { if(x==1&&(!(g[x][y]&2))) return 1; if(x==4&&(!(g[x][y]&8))) return 3; if(y==1&&(!(g[x][y]&1))) return 0; if(y==6&&(!(g[x][y]&4))) return 2; return -1; } int can(int x,int y) { return (x>=1&&x<=4&&y>=1&&y<=6)&&!v[x][y]; } int solve(int x,int y,int dep,int maxd) { if(dep>maxd) return 0; int tmp=check(x,y); if(tmp!=-1) { ans[dep]=tmp; return 1; } for(int i=0; i<4; i++) { int xx=x+dx[i]; int yy=y+dy[i]; if(can(xx,yy)) { if(!(g[x][y]&d[i])) { v[xx][yy]=1; ans[dep]=dir[i]; if(solve(xx,yy,dep+1,maxd)) return 1; v[xx][yy]=0; } else { if(!(g[xx][yy]&d[i])) { v[xx][yy]=1; g[x][y]-=d[i]; g[xx][yy]+=d[i]; ans[dep]=dir[i]; g[xx][yy]-=d[(i+2)%4]; if(can(xx+dx[i],yy+dy[i])) g[xx+dx[i]][yy+dy[i]]+=d[(i+2)%4]; if(solve(xx,yy,dep+1,maxd)) return 1; v[xx][yy]=0; g[x][y]+=d[i]; g[xx][yy]-=d[i]; g[xx][yy]+=d[(i+2)%4]; if(can(xx+dx[i],yy+dy[i])) g[xx+dx[i]][yy+dy[i]]-=d[(i+2)%4]; } } } } return 0; } int main() { #ifdef debug freopen("in.in","r",stdin); #endif // debug while(scanf("%d%d",&sty,&stx)==2&&(stx+sty)) { for(int i=1; i<=4; i++) for(int j=1; j<=6; j++) scanf("%d",&g[i][j]); for(int maxd=1;; maxd++) { memset(v,0,sizeof(v)); v[stx][sty]=1; if(solve(stx,sty,0,maxd)) { printf("%s\n",ans); break; } } } return 0; }
题目地址:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1325
题解:迭代加深。(g[x][y]&num)==0时代表在num所对应方向上无障碍。每次走动时,若无障碍,则直接走。否则,在不存在连续两堵墙的情况下,推进一堵墙,同时更改当前位置的墙数,下一步位置的墙数以及下下步位置的墙数。