给一个H×W的网格,一开始在左上角(1,1)每一步只能向右或向下走,不能经过 '#' 格子,求走到右下角(H,W)有多少种走法。 用C++语言进行编程
时间: 2024-02-09 10:12:52 浏览: 86
可以使用动态规划算法来解决这个问题,具体实现如下:
```c++
#include <iostream>
#include <vector>
using namespace std;
const int N = 105;
char g[N][N];
int f[N][N];
int main() {
int h, w;
cin >> h >> w;
// 输入网格图
for (int i = 1; i <= h; i++) {
for (int j = 1; j <= w; j++) {
cin >> g[i][j];
}
}
// 初始化边界条件
f[1][1] = 1;
for (int i = 2; i <= w; i++) {
if (g[1][i] != '#') {
f[1][i] = f[1][i - 1];
}
}
for (int i = 2; i <= h; i++) {
if (g[i][1] != '#') {
f[i][1] = f[i - 1][1];
}
}
// 计算状态转移方程
for (int i = 2; i <= h; i++) {
for (int j = 2; j <= w; j++) {
if (g[i][j] != '#') {
f[i][j] = f[i - 1][j] + f[i][j - 1];
}
}
}
// 输出结果
cout << f[h][w] << endl;
return 0;
}
```
时间复杂度为 O(HW),空间复杂度为 O(HW)。
阅读全文