1、据说古代有一个梵塔,塔内有三个底座A、B、C,A 座上有64 个盘子,盘子大小不等,大的在下,小的在上。有一个和尚想把这64 个盘子从A 座移到C 座,但每次只能允许移动一个盘子。在移动盘子的过程中可以利用B 座,但任何时刻3 个座上的盘子都必须始终保持大盘在下、小盘在上的顺序。如果只有一个盘子,则不需要利用B 座,直接将盘子从A 移动到C 即可。编写函数,接收一个表示盘子数量的参数和分别表示源、目标、临时底座的参数,然后输出详细移动步骤和每次移动后三个底座上的盘子分布情况。
时间: 2024-03-21 12:38:49 浏览: 304
人工智能-A星搜索(Java)-二阶汉塔(梵塔)问题.zip
5星 · 资源好评率100%
这是一个经典的汉诺塔问题,可以使用递归算法来解决。下面是一个 Python 的实现:
```python
def hanoi(n, source, target, temp):
if n == 1:
print("Move disk 1 from", source, "to", target)
print(source, ":", [1], temp, ":", [], target, ":", [])
return
hanoi(n-1, source, temp, target)
print("Move disk", n, "from", source, "to", target)
source_list = list(range(n, 0, -1))
target_list = [n] + list(range(n-1, 0, -1))
print(source, ":", source_list, temp, ":", [], target, ":", target_list)
hanoi(n-1, temp, target, source)
```
调用函数 `hanoi(3, 'A', 'C', 'B')` 可以得到结果:
```
Move disk 1 from A to C
A : [3, 2] B : [] C : [1]
Move disk 2 from A to B
A : [3] B : [2] C : [1]
Move disk 1 from C to B
A : [3] B : [2, 1] C : []
Move disk 3 from A to C
A : [] B : [2, 1] C : [3]
Move disk 1 from B to A
A : [1] B : [2] C : [3]
Move disk 2 from B to C
A : [1] B : [] C : [3, 2]
Move disk 1 from A to C
A : [] B : [] C : [3, 2, 1]
```
其中第一行表示移动第 n 个盘子,从 source 移动到 target;后面三行分别表示三个底座上盘子的分布情况。例如第一个 Move 后,A 底座上只剩下 2 个盘子,大小分别为 3 和 2,B 底座为空,C 底座上只有大小为 1 的盘子。
阅读全文