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 }
View Code

 

posted @ 2025-09-04 15:39  Guo5919  阅读(7)  评论(0)    收藏  举报