#3爆了求助 longlong开了

P1002 [NOIP2002 普及组] 过河卒

运行错误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


|