1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
| #include <bits/stdc++.h> using namespace std; char mp[55][55],cmd[55]; int dp[55][55][55]; const int INF = 0x3f3f3f3f; int n,m,ans,len; struct node { int x,y,k; }; queue<node> Q; bool check(int x,int y) { if((x>=1) && (x<=n) && (y>=1) && (y<=m) && mp[x][y]!='#')return true; return false; } int num(char c) { if(c=='L')return 0; if(c=='R')return 1; if(c=='U')return 2; if(c=='D')return 3; } void BFS() { int dx[4]= {0,0,-1,1}; int dy[4]= {-1,1,0,0}; node now,nxt; int cmd_go; for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) if(mp[i][j]=='R') { Q.push({ i,j,1 }); dp[i][j][1]=0; break; } while(!Q.empty()) { now=Q.front(); Q.pop();
if(mp[now.x][now.y]=='E') { ans=min(ans,dp[now.x][now.y][now.k]); continue; } for(int i=0; i<4; i++) { nxt.x=now.x+dx[i]; nxt.y=now.y+dy[i]; if(now.k<=len) cmd_go=num(cmd[now.k]); else cmd_go=-1; if(!check(nxt.x,nxt.y)) { if(cmd_go==i) { if(dp[now.x][now.y][now.k+1] > dp[now.x][now.y][now.k]) { if(dp[now.x][now.y][now.k+1]==INF) Q.push({ now.x,now.y,now.k+1 }); dp[now.x][now.y][now.k+1]=dp[now.x][now.y][now.k]; } } } else { if(cmd_go==i) {
if(dp[nxt.x][nxt.y][now.k+1] > dp[now.x][now.y][now.k]) { if(dp[nxt.x][nxt.y][now.k+1] == INF) Q.push( { nxt.x,nxt.y,now.k+1 }); dp[nxt.x][nxt.y][now.k+1]=dp[now.x][now.y][now.k]; } } else { if(dp[nxt.x][nxt.y][now.k] > dp[now.x][now.y][now.k] + 1) { if(dp[nxt.x][nxt.y][now.k] == INF) Q.push( { nxt.x,nxt.y,now.k }); dp[nxt.x][nxt.y][now.k]=dp[now.x][now.y][now.k] + 1; } } } } } } int main() {
scanf("%d%d",&n,&m); for(int i=1; i<=n; i++)scanf("%s",mp[i]+1); scanf("%s",cmd+1); len=strlen(cmd+1); memset(dp,63,sizeof(dp));
ans=INF;
BFS(); printf("%d\n",ans); return 0; }
|