C语言简单实现汉诺塔问题
C语言简单实现汉诺塔问题
汉诺塔基本介绍
什么是汉诺塔?
- 三根圆柱,其中一根圆柱上有n个圆盘,且圆盘是按照从上到下逐渐变大的方式排列。
- 规定一次只能移动一个圆盘,且圆盘始终保持从上到下逐渐变大的方式排列,最终将所有圆盘全部移到另一根柱子上。
使用C语言解决汉诺塔问题
本次实现汉诺塔问题只是简单打印到屏幕上编号圆盘
-
分析解决问题思路:
- 将n-1个圆盘,通过目标柱转移至辅助柱。
- 将第n个圆盘,移至目标柱。
- 将n-1个圆盘,通过辅助柱转移至目标柱。
-
代码实现
-
首先创建一个移动函数,作用为打印编号盘移动目标。
-
void move(int n, char a, char c) { printf("%d:%c - > %c\n", n, a, c);// n是圆盘编号 }
-
-
使用递归完成汉诺塔问题
-
void Hanoi(char a, char b, char c, int n) { if(n == 1) // 当只有一个圆盘时,只要移至目标柱即可。 { move(n, a, c); return; } Hanoi(a, c, b, n - 1); // 完成前n-1个圆盘通过目标柱转移至辅助柱。 move(n, a, c); Hanoi(b, a, c, n - 1); // 完成前n-1个圆盘通过辅助柱转移至目标柱。 }
-
-
-
完整代码:
-
#include <stdio.h> void move(int, char, char); void Hanoi(char a, char b, char c, int n) { if(n == 1) { move(n, a, c); return; } Hanoi(a, c, b, n - 1); move(n, a, c); Hanoi(b, a, c, n - 1); } void move(int n, char a, char c) { printf("%d:%c - > %c\n", n, a, c);// n是圆盘编号 } int main() { // 汉诺塔问题 // A、B、C三根柱子 char a = 'A'; char b = 'B'; char c = 'C'; int n = 0; // 圆盘变量 scanf("%d", &n); Hanoi(a, b, c, n); return 0; }
-
-