P1002 過河卒
阿新 • • 發佈:2020-09-08
題目連結: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 }