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 }

浙公网安备 33010602011771号