3和4过不了,求助大佬啊

P1002 [NOIP2002 普及组] 过河卒

```cpp #include<iostream> using namespace std; //int max(int a, int b) //{ // if (a > b) // return a; // else // return b; //} int main() { int m, n, a, b; cin >> m >> n >> a >> b; m += 100; n += 100; a += 100; b += 100; bool flag[125][125] = {0}; flag[a][b] = 1; // for (int i = -3; i < 4; i++) // { // for (int j = -3; j < 4; j++) // { // int n1 = abs(i), n2 = abs(j); // if ((n1 + n2 == 3)&&(max(n1, n2) == 2)&&(max(a+i,b+j)>-1)) // arr[a + i][b + j] = -1; // } // } flag[a+2][b+1] = 1; flag[a+1][b+2] = 1; flag[a-1][b+2] = 1; flag[a-2][b+1] = 1; flag[a-2][b-1] = 1; flag[a-1][b-2] = 1; flag[a+1][b-2] = 1; flag[a+2][b-1] = 1; long long arr[125][125] = {0}; for (int i = 100; i < m + 1; i++) { if (flag[i][100] == 0) { arr[i][100] = 1; } else { break; } } for (int i = 100; i < n + 1; i++) { if (flag[100][i] == 0) { arr[100][i] = 1; } else { break; } } for (int i = 101; i < m + 1; i++) { for (int j = 101; j < n + 1; j++) { if (flag[i][j] != 1) { // if (i > 0 && j > 0) arr[i][j] = arr[i - 1][j] + arr[i][j - 1]; // else // arr[i][j] = 1; } } } cout << arr[m][n]; } ```
by wjr_jok @ 2024-03-06 21:02:45


1.标记马所占领的位置时可以直接用访问下标实现,且要放在最前面以便后面初始化arr数组 2.初始化马占领的点时单独开一个标记数组,不然会影响到方案数的累加 3.初始化arr要把行,列,分开来,因为对于一行,一列,遇到被马占领的点后就不能继续走了,要结束循环,放在一起初始化会互相干扰 4.转移时直接累加即可,只用判是否被马占领就行了
by wjr_jok @ 2024-03-06 21:08:27


@[Merkin_39](/user/1291293)
by wjr_jok @ 2024-03-06 21:09:30


@[wjr_jok](/user/1236806) 明白了,谢谢大佬指点!
by Merkin_39 @ 2024-03-11 22:06:32


|