写在前面:
我是一个小小的程序员,我的野心是成为一个全栈工程师!!!
正文:
这是我用来记录学习算法的一个系列。希望能与所有人共进步。
好了,不废话了,直接上代码。
/***********************************
**
** 算法:汉诺塔
**
** 问题:有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,
** 要把所有盘子一个一个移动到柱子C上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,
** 请问至少需要多少次移动,设移动次数为H(n)。
**
** 解决:
**
***********************************/
#include <stdio.h>
#include <stdlib.h>
static int Time=0;
int main()
{
int n;
printf("请输入圆盘个数: ");
scanf("%d",&n);
hanoi(n,'A','B','C');
printf("移动次数:%d",Time);
return 0;
}
/**
* 将n个圆盘从A移动到C上,B为缓冲区
*/
void hanoi(int n,char A,char B,char C) {
if(n==1) {
//如果只有一个盘,直接从A移动到C即可
move(n,A,C);
}else {
//否则将A柱子上n-1个圆盘用此函数移动到B柱子上放着
hanoi(n-1,A,C,B);
//然后将最大的圆盘n放到C盘上
move(n,A,C);
//再将B柱上的n-1个圆盘通过以A柱为缓冲区,移动到C柱上
hanoi(n-1,B,A,C);
}
}
/**
* 移动圆盘
* @param n int 圆盘序号
* @param Source char 源柱子
* @param Target char 目标柱子
*/
void move(int n,char Source,char Target) {
printf("将第%d个圆盘从%c移动到%c\n",n,Source,Target);
Time++;
}
具体内容请看注释以及自己复制后运行一下,再结合代码参透其中的内容,其核心就是一个递归。
小尾巴:
吾王剑之所指,即吾等身之所向。