C语言实现汉诺塔求解
(配图来源网络)
今天实现一个递归的经典题目:汉诺塔求解。
有三根柱子,在a柱子上按照大小顺序一次摆放着n个圆盘,我们希望把这n个圆盘从a柱子借助b柱子移动到c柱子上,要求:一、每次只能移动一个圆盘。二、大的圆盘永远不能压在小的圆盘上。
我们如果不知道其中的技巧是很难完成求解的,但是我们可以用递归求解,我们要把a上的圆盘全部移动到c上,那么我们首先要把前n-1个圆盘移动到b上,此时a上还有一个最底层的圆盘,而c上没有圆盘(对应配图状态3),我们才可以把这个最底层的圆盘移动到c上,移动之后(对应配图状态4),问题变成了把b上n-1个圆盘借助a移动到c,如此形成了递归,一直到a上只剩一个最小的圆盘,b上没有圆盘,c上有后n-1个圆盘,也就是临界条件。
输入:整数n,代表n圆盘
输出:每次移动的情况,x->x
示例:3
a->c
a->b
c->b
a->c
b->a
b->c
a->c
代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
void move (int n, char a, char b, char c);
int main ()
{
int n;
scanf ("%d", &n);
move (n, 'a', 'b', 'c');
system ("pause");
return 0;
}
void move (int n, char a, char b, char c)
{
if (n == 1)
printf ("%c->%cn", a, c); //临界条件,当n为1时,直接从a移动到c
else
{ //n不为1
move (n - 1, a, c, b);
printf ("%c->%cn", a, c);
move (n - 1, b, a, c);
}
}