给定一个 n×n 的二维网格,你从左上角 (0,0) 出发,可以选择往下走或者往右走。每次走一步,你可以选择往下移动一格或者往右移动一格。请计算从 (0,0) 到 (n−1,n−1) 的不同路径数。
输入包含一个整数 n (1≤n≤15),表示网格的大小。
输出一个整数,表示从 (0,0) 到 (n−1,n−1) 的不同路径数。
3
6
这是从坐标 (0,0) 到坐标 (n−1,n−1) 的不同路径数。
给定一个 n×n 的二维网格,从左上角 (0,0) 出发,你可以选择往下走或者往右走。每次走一步,你可以选择往下移动一格或者往右移动一格。请计算从 (0,0) 到 (n−1,n−1) 的不同路径数。
本题是典型的动态规划或递归问题,下面通过递归的方法来求解。
uniquePaths(x, y)
,表示从位置 (x,y) 到达右下角 (n−1,n−1) 的不同路径数。每次只能向右或向下走。因此,从当前位置 (x,y) 到 (n−1,n−1) 的路径数,可以分解为两种情况:
对应代码:
def uniquePaths(x, y, n):
# 基本情况:如果到达右下角 (n-1, n-1),返回 1
if x == n - 1 and y == n - 1:
return 1
paths = 0
# 向下走
if x < n - 1:
paths += uniquePaths(x + 1, y, n) # 递归计算向下走的路径数
# 向右走
if y < n - 1:
paths += uniquePaths(x, y + 1, n) # 递归计算向右走的路径数
return paths
在这个步骤中,我们通过递归将问题分解为向右走和向下走两种情况的路径数累加。
对应代码:
# 基本情况:如果到达右下角 (n-1, n-1),返回 1
if x == n - 1 and y == n - 1:
return 1
这个条件确保我们在到达目标时停止递归,并返回 1 表示到达了一条有效路径。
对应代码:
# 向下走
if x < n - 1:
paths += uniquePaths(x + 1, y, n)
# 向右走
if y < n - 1:
paths += uniquePaths(x, y + 1, n)
当到达网格的最后一行或最后一列时,代码会确保只向右或只向下走。递归会自动停止,当路径到达右下角时,返回 1。
对应代码:
if __name__ == "__main__":
n = int(input()) # 输入网格的大小
print(uniquePaths(0, 0, n)) # 从 (0, 0) 出发
这里,我们在主函数中输入网格的大小 ( n ),然后调用递归函数 uniquePaths(0, 0, n)
从左上角开始计算路径数。
递归的时间复杂度为 O(2^(m+n)),其中 ( m ) 和 ( n ) 是网格的尺寸。每个步骤都有两种选择(向下或向右),因此递归的深度为 ( m+n ),递归树的大小是指数级的。
def uniquePaths(x, y, n):
# 基本情况:如果到达右下角 (n-1, n-1),返回 1
if x == n - 1 and y == n - 1:
return 1
paths = 0
# 向下走
if x < n - 1:
paths += uniquePaths(x + 1, y, n) # 递归计算向下走的路径数
# 向右走
if y < n - 1:
paths += uniquePaths(x, y + 1, n) # 递归计算向右走的路径数
return paths
# 主函数
if __name__ == "__main__":
n = int(input()) # 输入网格的大小
print(uniquePaths(0, 0, n)) # 从 (0, 0) 出发