题解 | #[NOIP2002 普及组] 过河卒#
[NOIP2002 普及组] 过河卒
https://www.nowcoder.com/practice/cc1a9bc523a24716a117b438a1dc5706
#include <cmath>
#include <complex>
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, m, x, y;
cin >> n >> m;
cin >> x >> y;
vector<vector<long long>> dp(n + 1, vector<long long>(m + 1));
dp[0][0] = 1;
for (int i = 1; i <= m; i++) { //列是y坐标
if (((abs(i - y) + abs(0 - x) ) == 3 && (i != y) && 0 != x) || (x == 0 && y == i))
dp[0][i] = 0;
else {
dp[0][i] = dp[0][i - 1];
};
}
for (int i = 1; i <= n; i++) { //行坐标是x坐标
if (((abs(i - x) + abs(0 - y)) == 3 && i != x && 0 != y) || (x == i &&y == 0)) dp[i][0] = 0;
else {
dp[i][0] = dp[i - 1][0];
};
}
for (int i = 1; i <= n; i ++) {
for (int j = 1; j <= m; j++) {
if ((abs(i - x) + abs(j - y) == 3 && i != x && j != y) || (i == x && j == y)) dp[i][j] = 0;
else {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
}
cout << dp[n][m];
return 0;
}

