要解决这个问题,我们可以使用动态规划(Dynamic Programming, DP)的方法。具体来说,我们用一个二维数组 dp 来记录从起点 (0, 0) 到达每个格子的路径数。对于每个格子 (i, j),它的路径数可以从上方 (i-1, j) 或左方 (i, j-1) 的格子转移过来,前提是这些格子不是障碍物。
以下是详细的 C++ 代码实现:
代码解释
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
这个程序能够正确计算从起点到终点的路径数,考虑了障碍物的影响。