汉诺塔问题在C语言中一般采用递归法来写,假设有A、B、C三根棒,A棒放着若干个圆盘,将其移动到C棒上,中途可在B棒中暂时放置圆盘。
分析:
(1) 如果只有一个圆盘,则把该圆盘从A棒移动到C棒
(2) 如果圆盘数量n>1,移动圆盘的过程可分为如上图
第一步: 将A棒上的n-1个圆盘移动到B棒上。
第二步: 将A棒上的一个圆盘移动到C棒上。
第三步: 将B棒上的n-1个圆盘移动到C棒上。
完成目标:将n个圆盘从A搬运到C,求需要移动多少次完成?
约束条件:搬运的过程中每次只能移动一个圆盘,且不能出现大的圆盘在小的圆盘之上。
#include<stdio.h>
#include<string.h>
//函数声明
void move(char x, char y);
void hannuota(int n, char a, char b, char c)
{
if (n == 1)
move(a, c);
else
{
hannuota(n - 1, a, c, b); //将n-1个圆盘转移到B棒上,C做转移棒
move(a, c); //再把A棒上的圆盘转移到C上
hannuota(n - 1, b, a, c); //把B棒上n-1个圆盘移到C上
}
}
void move(char x,char y)
{
printf("%c-->%c\n", x,y);
}
int main()
{
int n;
printf("input your number!\n");
scanf_s("%d", &n);
hannuota(n, 'A', 'B', 'C'); //A B C代表三个棒
return 0;
}
如果n=3
运行结果:
A-->C 最小的到C
A-->B 第二层的到B
C-->B 最小的到第二小的上面
A-->C 最大的到C
B-->A 最小的到A
B-->C 第二小的到C
A-->C 最小的到C
与上面的动态图应该是一致的。
这是我第一次写博客,写的不好请见谅,写的是C语言中经典的递归问题。