题解
2024-11-14 19:13:49
发布于:浙江
25阅读
0回复
0点赞
要解决这个问题,我们可以使用动态规划(Dynamic Programming, DP)的方法。具体来说,我们用一个二维数组 dp 来记录从起点 (0, 0) 到达每个格子的路径数。对于每个格子 (i, j),它的路径数可以从上方 (i-1, j) 或左方 (i, j-1) 的格子转移过来,前提是这些格子不是障碍物。
以下是详细的 C++ 代码实现:
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int MAXN = 1005;
int dp[MAXN][MAXN];
char grid[MAXN][MAXN];
int main() {
int n, m;
cin >> n >> m;
for (int i = 0; i < n; ++i) {
cin >> grid[i];
}
if (grid[0][0] == 'X') {
cout << 0 << endl;
return 0;
}
dp[0][0] = 1;
for (int j = 1; j < m; ++j) {
if (grid[0][j] == 'X') {
dp[0][j] = 0;
break;
} else {
dp[0][j] = 1;
}
}
for (int i = 1; i < n; ++i) {
if (grid[i][0] == 'X') {
dp[i][0] = 0;
break;
} else {
dp[i][0] = 1;
}
}
for (int i = 1; i < n; ++i) {
for (int j = 1; j < m; ++j) {
if (grid[i][j] == 'X') {
dp[i][j] = 0;
} else {
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
}
cout << dp[n-1][m-1] << endl;
return 0;
}
代码解释
1.
输入读取:
•
读取 n 和 m,表示方格的行数和列数。
•
读取 n 行字符串,存储在二维字符数组 grid 中。
2.
初始化:
•
如果起点 (0, 0) 是障碍物,直接输出 0 并结束程序。
•
否则,初始化 dp[0][0] = 1,表示从起点到起点有一种走法。
3.
填充第一行和第一列:
•
对于第一行,从左到右遍历,如果遇到障碍物,则后面的所有格子都无法到达。
•
对于第一列,从上到下遍历,如果遇到障碍物,则后面的所有格子都无法到达。
4.
填充剩余的格子:
•
对于每个格子 (i, j),如果它是障碍物,则 dp[i][j] = 0。
•
否则,dp[i][j] 等于从上方格子 (i-1, j) 和左方格子 (i, j-1) 转移过来的路径数之和。
5.
输出结果:
•
最终结果保存在 dp[n-1][m-1] 中,表示从起点到终点的路径数。
示例运行
假设输入为:
7 7
0000000
0000XX0
0X000X0
0X000X0
00XX0X0
X000000
00X0000
程序的输出将是:
56
这个程序能够正确计算从起点到终点的路径数,考虑了障碍物的影响。
这里空空如也
有帮助,赞一个