1. 程式人生 > 實用技巧 >P1002 過河卒

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 }