动态规划:洛谷P1002 [NOIP2002 普及组] 过河卒

洛谷P1002 [NOIP2002 普及组] 过河卒

 

 

  其实看到这种二维图,像走迷宫,我就想到了广度优先搜索,BFS。但是我发现了卒只能向下走和向右走,我就想到了动态规划。状态转移方程是:dp[i][j]=dp[i-1][j]+dp[i][j-1],然后因为在边缘的一圈的边界条件都无法用这个方程,所以我们干脆让每个坐标都++,不管边界条件,把起点和终点加加,注意把数组初始化在main外,这样可以初始化为0.

上代码:

 1 #include<iostream>
 2 using namespace std;
 3 bool vis[25][25];
 4 long long dp[25][25];//就是 dp 数组
 5 int main()
 6 {
 7     dp[1][1] = 1;
 8     int n, m, x, y;
 9     cin >> n >> m >> x >> y;
10     n++;//把每个参数都加1 这样就不用考虑边界条件
11     m++;
12     x++;
13     y++;
14     vis[x][y] = 1;
15     vis[x - 2][y - 1] = 1;
16     vis[x - 2][y + 1] = 1;
17     vis[x + 2][y - 1] = 1;
18     vis[x + 2][y + 1] = 1;
19     vis[x - 1][y + 2] = 1;
20     vis[x - 1][y - 2] = 1;
21     vis[x + 1][y + 2] = 1;
22     vis[x + 1][y - 2] = 1;//标记一下马的控制点
23     for (int i = 1; i <= n; i++)
24         for (int j = 1; j <= m; j++)
25         {
26             if ((i != 1 || j != 1)/*就是不考虑1, 1这个点*/ && !vis[i][j])
27             {
28                 dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
29             }
30         }
31 
32     printf("%lld", dp[n][m]);
33 }

 

AC图:

 

 

结束啦,有空我再用BFS做一下。

posted @ 2022-04-02 11:03  朱朱成  阅读(66)  评论(0编辑  收藏  举报