class Solution:
### 1113 循环求余(40 ms,13.5 MB)
def fib(self, n: int) -> int:
a, b = 0, 1 # 初始条件
for _ in range(n): # 循环求余
a, b = b, a+b
return a % 1000000007
汉诺塔问题
class Solution:
def hanota(self, A: List[int], B: List[int], C: List[int]) -> None:
"""
Do not return anything, modify C in-place instead.
"""
n = len(A)
self.move(n, A, B, C)
# 定义move 函数移动汉诺塔
def move(self, n, A, B, C):
if n == 1:
C.append(A[-1])
A.pop()
return
else:
self.move(n-1, A, C, B) # 将A上面n-1个通过C移到B
C.append(A[-1]) # 将A最后一个移到C
A.pop() # 这时,A空了
self.move(n-1,B, A, C) # 将B上面n-1个通过空的A移到C
- 3柱汉诺塔公式:
移动次数 = 2 ** n - 1
- 3柱汉诺塔(打印移动路径 & 统计移动次数)
ls = []
def hanoi(n, from_tower, to_tower, aux_tower):
"""
:param n: 盘子数量
:param from_tower: 起始塔
:param to_tower: 目标塔
:param aux_tower: 辅助塔
"""
if n == 1:
# print(f"Move disk 1 from {from_tower} to {to_tower}")
ls.append(1)
return
# 先从A移动到B,此时将C作为辅助柱子
hanoi(n-1, from_tower, aux_tower, to_tower)
# print(f"Move disk {n} from {from_tower} to {to_tower}")
ls.append(1)
# 再从B移动到C,此时将A作为辅助柱子
hanoi(n-1, aux_tower, to_tower, from_tower)
n = 4 # 盘子数量
hanoi(n, 'A', 'C', 'B')
len(ls) # 计算移动次数
- 4柱汉诺塔(考虑最少的移动次数)
知乎:四柱汉诺塔问题(python代码实现)
def hanoi4(n):
mem = [0] * (n + 1)
# 递归函数
def fun(m):
if mem[m]:
return mem[m]
move = 2 ** m - 1 # 由3柱汉诺塔公式设置而来
for x in range(1, m):
# 这里需要考虑最少的移动次数
move = min(move, 2 * f(x) + 2 ** (m - x) - 1)
mem[m] = move
return move
return fun(n)
n = 3
res = hanoi4(n)
print(res)