现有一个 m*n 的网格,从最左上角出发,每次只能向右或者向下移动一格,问有多少种不同的方法可以到达最右下角的格子? 用c++编递归函数
时间: 2024-11-27 09:23:28 浏览: 29
这个问题属于动态规划中的“蛇形矩阵”或者“爬楼梯”问题,通常可以用递归解决,也可以用二维数组来存储中间状态。下面是使用递归的C++函数实现:
```cpp
#include <vector>
using namespace std;
// 递归函数,dp[i][j] 表示到达(i, j)位置的方法数
int countWays(int m, int n, vector<vector<int>>& dp) {
// 边界条件
if (m == 0 || n == 0) {
return 1; // 如果已经到达右下角,只有一种方法
}
// 如果当前位置已经被访问过,直接返回结果
if (dp[m][n]) {
return dp[m][n];
}
// 从上一列和当前行、左一行和当前列两个方向考虑
dp[m][n] = countWays(m - 1, n, dp) + countWays(m, n - 1, dp); // 向右或向下
return dp[m][n];
}
int main() {
int m, n;
cout << "请输入矩阵的行数m和列数n: ";
cin >> m >> n;
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0)); // 初始化dp数组
cout << "到达(," << m << "," << n << ")的不同方法有: " << countWays(m, n, dp) << endl;
return 0;
}
```
在这个递归函数中,我们通过动态地填充 `dp` 数组来避免重复计算。
阅读全文