当前位置:主页 > 软件编程 > C代码 >

C语言汉诺塔的简单了解

时间:2021-06-19 08:18:03 | 栏目:C代码 | 点击:

汉诺塔详解

以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

在这里插入代码片
```// 汉诺塔问题
//输出移动的步骤 
#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;
}

总结

您可能感兴趣的文章:

相关文章