P1002 过河卒

题目链接:P1002

解题思路:

递推得到从A到B点的方法数,如果遇到控制点,则到达该点的方法数为0

AC代码:

 

 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 long long  g[21][21];
 5 int bx,by,hx,hy;
 6 int d[9][2] = {{0,0},{2,1},{2,-1},{1,2},{1,-2},{-1,2},{-2,1},{-1,-2},{-2,-1}}; // 马所在点也为控制点
 7 int main()
 8 {
 9     cin >> bx >> by >> hx >> hy;
10     g[0][0] = 1; // 初始化
11     for(int i = 0; i <= bx; i++)
12     {
13         for(int j = 0; j <= by; j++)
14         {
15             if(i == 0 && j == 0) continue; 
16             int f = 0; // 标记是否为控制点
17             for(int k = 0; k <= 8; k++)
18             {
19                 int x = hx,y = hy;
20                 x += d[k][0];
21                 y += d[k][1];
22                 if(x == i && y == j)
23                 {
24                     f = 1;
25                     break;
26                 }
27             }
28             if(f) continue; // 为控制点则跳过
29             else {
30                 if(i == 0) g[i][j] = g[i][j-1]; // 边界
31                 else if(j == 0) g[i][j] = g[i-1][j]; // 边界都是1,1种方案
32                 else g[i][j] = g[i-1][j]+g[i][j-1];
33             }
34         }
35     }
36     cout << g[bx][by];
37     return 0;
38 }

 

posted @ 2020-09-08 13:53  不敢说的梦  阅读(162)  评论(0)    收藏  举报