@[szlh_XJS](/user/672757)
代码中没有考虑到当卒在马控制的点时,应该终止该路径的计算,因为已经通过设置 ```nn[i][j] = 0``` 做了标记,但在累加路径时没有有效利用这一点。
没有处理如果马的控制点恰好在棋盘的最左列或最上行的情况,会影响到初始条件的设置的。
正解:
```
#include<bits/stdc++.h>
using namespace std;
long long n, m, a, b;
long long nn[25][25]; // 存储路径的数量
int main() {
cin >> n >> m >> a >> b;
// 把马和马能影响到的点的标志设为0,其余默认为0(初始化状态)
memset(nn, 0, sizeof(nn)); // 将nn数组全部初始化为0
// 标记马的控制点
nn[a][b] = -1; // -1代表这个点是马的控制点
int dx[] = {-2, -2, -1, -1, 1, 1, 2, 2};
int dy[] = {-1, 1, -2, 2, -2, 2, -1, 1};
for (int i = 0; i < 8; ++i) {
int x = a + dx[i], y = b + dy[i];
if (x >= 0 && x <= n && y >= 0 && y <= m) {
nn[x][y] = -1; // 标记马能攻击到的位置
}
}
// 初始化棋盘的最左边和最上边
for (long long i = 0; i <= n; i++) {
if (nn[i][0] != -1) nn[i][0] = 1;
else break; // 遇到马的控制点就停止
}
for (long long j = 0; j <= m; j++) {
if (nn[0][j] != -1) nn[0][j] = 1;
else break; // 遇到马的控制点就停止
}
// 计算路径数量
for (long long i = 1; i <= n; i++) {
for (long long j = 1; j <= m; j++) {
if (nn[i][j] == -1) continue; // 遇到马的控制点就跳过
// 更新路径数,如果邻近点不是马的控制点
if (nn[i-1][j] != -1) nn[i][j] += nn[i-1][j];
if (nn[i][j-1] != -1) nn[i][j] += nn[i][j-1];
}
}
cout << nn[n][m] << endl; // 输出到达B点的路径数量
return 0;
}
```
by TPJ_XiaoJing @ 2024-03-17 20:01:08
@[TPJ_XiaoJing](/user/1280061) 感谢,送大佬个关
by szlh_XJS @ 2024-03-17 20:14:40