```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