汉诺塔详解
以4层为例
以下为我的拙见,还希望大佬雅正
要把汉诺塔移动到c 需要把1,2,3层移到b 把4移动到c 在吧123移动到b
但是一次只能动一块 所以我们目前要做的就是把上面三块移动到b
那就需要把1 2移动到c
由此我们可以推出要把1,2移动到c,只需要把1移动到b
这里我们发现有很多重复的自相似动作
我们就可以设计递归 递归需要1,递归体 2 出口。
递归体
移动n-1个盘子和1个盘子和n个盘子过程都是相似的
但是每次放入的杆子不一样。
出口
n=1时只剩一个盘子,直接移动到c即可
hanoi(n ,a , b , c)
n 移动数量
a 出发地
b 借助地
c 终点
这个函数的意思就是有n个盘子从a出发借助b来到c
现在有n层汉诺塔 就需要把上面n-1层移动到b
hanoi(n-1,a,c,b)
这个函数就是我们要把n-1个盘子从a借助c移动到b
move(a,c)现在不需要再借助了 可以直接从a移动到c
接下来我们就要借助a吧剩下n-1个盘子移动到c了
hanoi(n-1,b,a,c)即可完成
递归出口
n<=1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
在这里插入代码片
``` // 汉诺塔问题
//输出移动的步骤
#include <stdio.h>
//记录步数
int i = 1;
//n 第几号盘移动, from 移动塔 to 目标塔
void move( int n, char from, char to) {
printf ( "第%d次移动第%d号盘: %c----->%c\n" , i++, n, from, to);
}
void hanoi( int n, char from, char mid, char to) {
if (n == 1) {
move(n, from, to); //只有一个盘子是直接将初塔上的盘子移动到目的地
} //函数出口
else {
hanoi(n - 1, from, to, mid); //先将初始塔的前n-1个盘子借助目的塔移动到借用塔上
move(n, from, to); //将剩下的一个盘子移动到目的塔上
hanoi(n - 1, mid, from, to); //最后将借用塔上的n-1个盘子移动到目的塔上
}
}
int main() {
printf ( "请输入盘子的个数:\n" );
int n;
scanf_s( "%d" , &n);
char x = 'a' , y = 'b' , z = 'c' ;
printf ( "盘子移动情况如下:\n" );
hanoi(n, x, y, z);
return 0;
}
|
总结
到此这篇关于c语言汉诺塔的文章就介绍到这了,更多相关c语言汉诺塔内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/qq_45849625/article/details/110246963