题解 | #[NOIP2002 普及组] 过河卒#
[NOIP2002 普及组] 过河卒
https://www.nowcoder.com/practice/cc1a9bc523a24716a117b438a1dc5706
#include <iostream> using namespace std; // b点坐标和马的坐标 int xb, yb, xh, yh; // h为能否走的表示 long long h[30][30] = {0}, f[30][30] = {0}; int main() { cin >> xb >> yb >> xh >> yh; // 防止马在边界 xb += 2, yb += 2, xh += 2, yh += 2; // 马脚和马的位置设为1 不可走 h[xh][yh] = 1; h[xh + 1][yh + 2] = 1; h[xh - 1][yh - 2] = 1; h[xh + 2][yh + 1] = 1; h[xh + 1][yh - 2] = 1; h[xh - 1][yh + 2] = 1; h[xh + 2][yh - 1] = 1; h[xh - 2][yh + 1] = 1; h[xh - 2][yh - 1] = 1; // 初始化行列边界步数为1 因为边界没有别的地方可以到达 for(int i = 2; i < 30; i ++){ f[2][i] = f[i][2] = 1; } f[1][2] = 1; for(int i = 2; i <= xb; i ++){ for(int j = 2; j <= yb; j ++){ if(h[i][j] == 1){ // 无法走 跳过 f[i][j] = 0; continue; } f[i][j] = f[i - 1][j] + f[i][j - 1]; } } cout << f[xb][yb] << endl; return 0; }