求助,60分

P1002 [NOIP2002 普及组] 过河卒

@[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


|