Hanoi 问题 | Eternal_zttz

Hanoi 问题

一:有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:

  1. 每次只能移动一个圆盘;
  2. 大盘不能叠在小盘上面。
    请输出全部的移动操作。 输入:
    一个整数n,表示汉诺塔的层数(n < 20)
    输出:
    输出把汉诺塔从A移到C的全部操作,每个操作一行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <cstdio>
void Move(int n,char a,char b,char c){
if(n == 1)
printf("%c -> %c\n",a,c);
else{
Move(n-1,a,c,b);
printf("%c -> %c\n",a,c);
Move(n-1,b,a,c);
}
}
int main(){
int n;
scanf("%d",&n);
Move(n,'A','B','C');
return 0;
}

输入:

1
3

输出:

1
2
3
4
5
6
7
A -> C
A -> B
C -> B
A -> C
B -> A
B -> C
A -> C


二:还是汉诺塔,但是现在的汉诺塔只能在相邻的柱子间移动(A只能移动到B; B只能移动到A或C; C只能移动到B)。在整个移动过程中,任何时候都保证小盘子只能在大盘子上面。
还是给定层数数n,你需要输出把所有盘从A移到C的操作。
输入:
多组数据输入。
第一行是输入数据组数T(0<T<11)。
接下来T行,每行一个整数n(0<n<20),代表层数(盘子个数)。
输出:对于每组数据输出其对应的操作,每组数据间用一个空行隔开

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <cstdio>
void Move(int n,char a,char b,char c){
if(n == 1){
printf("%c -> %c\n",a,b);
printf("%c -> %c\n",b,c);
}
else{
Move(n-1,a,b,c);
printf("%c -> %c\n",a,b);
Move(n-1, c, b, a);
printf("%c -> %c\n",b,c);
Move(n-1, a, b, c);
}
}
int main(){
int n,t;
scanf("%d",&t);
for (int i =0;i<t;i++){
scanf("%d",&n);
Move(n, 'A', 'B', 'C');
printf("\n");
}
return 0;
}


运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
1
A -> B
B -> C

2
A -> B
B -> C
A -> B
C -> B
B -> A
B -> C
A -> B
B -> C


-------------The End-------------