1
0
mirror of https://github.com/renbaoshuo/202401-programming-assignments.git synced 2024-11-27 08:26:20 +00:00
202401-programming-assignments/【实践课外】11.函数2/6-5 汉诺塔.md

86 lines
1.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 6-5 汉诺塔
汉诺Hanoi塔问题是一个经典的递归问题。
设有A、B、C三个塔座开始时在塔座A上有若干个圆盘这些圆盘自下而上由大到小地叠在一起。要求将塔座A上的圆盘移到塔座B上并仍按同样顺序叠放。在移动过程中要求遵守如下规则
* 每次只能移动一个圆盘;
* 任何时刻都不允许将较大的圆盘压在较小的圆盘之上;
* 在满足前两条规则的前提下可将圆盘移至A、B、C中任何一塔座上。
例如3个圆盘的初始状态如下
![hanoi.png](~/d68d16f9-ba77-4edb-98b6-66348201a71a.png)
则移动过程如下:
A->B
A->C
B->C
A->B
C->A
C->B
A->B
要求实现一个递归函数,模拟输出$n(1<=n<=8)$个圆盘从塔座A借助塔座C移动到塔座B上的过程用A->B表示将圆盘从A移到B其他类似
### 函数接口定义:
```c++
void hanoi(int n, char from, char to, char by);
```
其中参数 `n`是圆盘数 、`from`是原来叠放圆盘的塔座 、`to`是最终叠放圆盘的塔座 、`by`是可借助的塔座。
### 裁判测试程序样例:
```c++
#include<iostream>
using namespace std;
//将n个圆盘借助by从from移到to
void hanoi(int n, char from, char to, char by);
//输入n输出将原来在A上的n个圆盘借助C移动到B上的移动过程控制到文件尾
int main() {
int n, cnt=0;
while(cin>>n) {
cnt++;
if (cnt>1) cout<<endl;
hanoi(n, 'A', 'B', 'C');
}
return 0;
}
```
### 输入样例:
```in
3
4
```
### 输出样例:
```out
A->B
A->C
B->C
A->B
C->A
C->B
A->B
A->C
A->B
C->B
A->C
B->A
B->C
A->C
A->B
C->B
C->A
B->A
C->B
A->C
A->B
C->B
```