用c++写一程序,一个机器人只能向下和向右移动,每次只能移动一步,设计一个算法求它从(0,0)移动到(m,n)有多少条路径。
时间: 2024-10-29 08:15:18 浏览: 12
要解决这个问题,我们可以使用动态规划的思想,创建一个二维数组`dp[m+1][n+1]`,其中`dp[i][j]`表示到达位置`(i, j)`的所有路径数。由于机器人只能向下或向右移动,所以对于当前位置`(i, j)`,其上一个位置可以是`(i-1, j)`或`(i, j-1)`。
程序的核心思路是这样的:
1. 初始化所有边界条件:第一个元素`(0, 0)`只有一个路径,即`(0, 0)`本身;如果其中一个坐标为0,另一个大于0,则没有路径。
```cpp
dp[0][0] = 1;
dp[i][0] = 0; // 如果行数i > 0,从(0, 0)无法到达(i, 0)
dp[0][j] = 0; // 同理,列数j > 0,从(0, 0)无法到达(0, j)
```
2. 动态填充数组:从`(1, 1)`开始,计算每个位置的路径数,通过累加上方和左方位置的路径数。
```cpp
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; // 从上一个格子走或者从左边格子走都算一次路径
}
}
```
完整的C++程序如下:
```cpp
#include <iostream>
// Function to calculate the number of paths from (0, 0) to (m, n)
int countPaths(int m, int n) {
int dp[m + 1][n + 1];
dp[0][0] = 1;
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
return dp[m][n];
}
int main() {
int m, n;
std::cout << "Enter the row and column dimensions: ";
std::cin >> m >> n;
int pathCount = countPaths(m, n);
std::cout << "The number of paths from (0, 0) to (" << m << ", " << n << ") is: " << pathCount << std::endl;
return 0;
}
```
阅读全文