0904
https://www.luogu.com.cn/problem/P1859
一道神奇的DP,因为这题用的是四维数组
dpa,b,c,d表示执行到指令a,位置(b,c),朝向为d
然后讨论四种情况。这里以第一种为例
当指令为FORWARD时,第一个状态表示执行了且走了一步到了 (x,y)。第二个状态表示没执行。
代码:
 
1 #include<bits/stdc++.h> 2 using namespace std; 3 int m,q,x,y,dp[2][102][102][4]; 4 int w[1002][2]={{-1,0},{0,1},{1,0},{0,-1}}; 5 char c[102][102]; 6 string op[1002]; 7 int main() 8 { 9 cin>>m>>q>>x>>y; 10 for(int i=1;i<=m;i++) 11 { 12 for(int j=1;j<=m;j++) 13 { 14 cin>>c[i][j]; 15 } 16 } 17 for(int i=1;i<=q;i++) cin>>op[i]; 18 memset(dp,0x3f,sizeof dp); 19 dp[0][x][y][0]=0; 20 for(int i=1;i<=q;i++) 21 { 22 for(int nx=1;nx<=m;nx++) 23 { 24 for(int ny=1;ny<=m;ny++) 25 { 26 if(c[nx][ny]=='*') continue; 27 for(int f=0;f<4;f++) 28 { 29 if(op[i]=="FORWARD") 30 { 31 dp[i&1][nx][ny][f]=min(dp[(i&1)^1][nx][ny][f]+1,dp[(i&1)^1][nx-w[f][0]][ny-w[f][1]][f]); 32 } 33 if(op[i]=="BACK") 34 { 35 dp[i&1][nx][ny][f]=min(dp[(i&1)^1][nx][ny][f]+1,dp[(i&1)^1][nx+w[f][0]][ny+w[f][1]][f]); 36 } 37 if(op[i]=="LEFT") 38 { 39 dp[i&1][nx][ny][f]=min(dp[(i&1)^1][nx][ny][f]+1,dp[(i&1)^1][nx][ny][(f+1)%4]); 40 } 41 if(op[i]=="RIGHT") 42 { 43 dp[i&1][nx][ny][f]=min(dp[(i&1)^1][nx][ny][f]+1,dp[(i&1)^1][nx][ny][(f+3)%4]); 44 } 45 } 46 } 47 } 48 } 49 int sum=2e9; 50 for(int i=1;i<=m;i++) 51 { 52 for(int j=1;j<=m;j++) 53 { 54 if(c[i][j]=='*') continue; 55 for(int f=0;f<4;f++) 56 { 57 sum=min(sum,dp[q&1][i][j][f]); 58 } 59 } 60 } 61 cout<<sum<<endl; 62 return 0; 63 }
 
                    
                
 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号