有一个 行 列的方格,一个机器人从左上走到右下,每步只能向右一格、或向下一格走。有多少种不同的走法? 请你按字典序升序,以字符串列出每一种走法。对于每一步,' ' 表示向右,' ' 表示向下。
时间: 2024-02-12 19:03:34 浏览: 110
这是一道经典的组合数学问题,可以用动态规划的方法求解。假设 $f(i,j)$ 表示从起点 $(1,1)$ 到 $(i,j)$ 的不同走法数目,则有以下递推式:
$$
f(i,j) = \begin{cases}
1 & i=1 \text{ 或 } j=1 \\
f(i-1,j)+f(i,j-1) & \text{otherwise}
\end{cases}
$$
根据递推式,可以先预处理出所有的 $f(i,j)$,然后根据 $f(i,j)$ 递推出每一种走法的具体路径。具体来说,可以从终点 $(m,n)$ 开始,每次判断它是从 $(m-1,n)$ 还是 $(m,n-1)$ 转移过来的,直到走到起点 $(1,1)$。
下面是 Python 代码实现:
```python
def findPaths(m: int, n: int) -> List[str]:
# 计算不同走法数目
dp = [[0] * (n + 1) for _ in range(m + 1)]
dp[1][1] = 1
for i in range(1, m + 1):
for j in range(1, n + 1):
if i == 1 or j == 1:
dp[i][j] = 1
else:
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
# 递推出具体路径
paths = []
def dfs(i, j, path):
if i == 1 and j == 1:
paths.append(path[::-1])
return
if i > 1 and dp[i - 1][j] > 0:
dfs(i - 1, j, path + 'D')
if j > 1 and dp[i][j - 1] > 0:
dfs(i, j - 1, path + 'R')
dfs(m, n, '')
# 按字典序升序排序
paths.sort()
return paths
```
例如,当 $m=2$、$n=3$ 时,不同走法数目为 $3$,具体路径为 `['DDRR', 'DRDR', 'RDDR']`。
阅读全文