运行错误4009: 内存访问越界, 位于变量unable[1]地址偏移21, 而可访问内存范围为0到20.
by 13867196971a @ 2023-07-20 14:00:23
$1.$用高精度
$2.$用不着高精度,代码如下
```cpp
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN = 22;
ll f[MAXN][MAXN] = {0};
int ctrl[MAXN][MAXN], n, m, hx, hy;
int d[9][2] = {{0, 0}, {1, 2}, {1, -2}, {-1, 2}, {-1, -2}, {2, 1},
{2, -1}, {-2, 1}, {-2, -1}
};/*马的控制范围相对于马位置的偏移量*/
int main() {
cin >> n >> m >> hx >> hy;
for (int i = 0; i < 9; i++) {
int tmpx = hx + d[i][0], tmpy = hy + d[i][1];
if (tmpx >= 0 and tmpx <= n and tmpy >= 0 and tmpy <= m) /*判断是否在棋盘范围内*/
ctrl[tmpx][tmpy] = 1; //记录马的控制点
}
f[0][0] = 1 - ctrl[0][0]; /*若原点就是马的控制点,则初始路径数量就是0,否则是1*/
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= m; j++) {
if (ctrl[i][j] == 1) continue; /*若这个点是控制点,则跳过*/
if (i != 0) f[i][j] += f[i - 1][j]; /*也可写成if(i),若不再横轴上就加上面路径数*/
if (j != 0) f[i][j] += f[i][j - 1]; /*该点不再纵轴上就加左边的路径数*/
}
}
cout << f[n][m]; //输出答案
return 0;
}
```
by FENGHAOZHE1234 @ 2023-07-20 14:37:35
~~用了动态规划$dp$的思想~~
是用递推式做的,放心食用
by FENGHAOZHE1234 @ 2023-07-20 14:39:50
破案了,确实是数组开小了(汗
by electronsky @ 2023-07-20 16:43:35