汉诺塔问题:
有三只柱子A,B,C,柱子A上有n个盘子,这n个盘子越往下越大,现要求把盘子挪到C上,一次挪只能一个,并且小的必须在上面。
问题分析:
一个盘子:
- A->C即可
两个盘子:
- A->B 首先将一个盘子放在B上作为中转
- A->C 这时将A上仅剩的一个盘子直接移动到C上
- B->C 将B上的一个盘子移动到C上,完成移动。
三个盘子:
- 将两个盘子移动到B上
- 最后一个盘子由A移动到C上
- 将B上的一个盘子移动到A上
- 将B上的一个盘子移动到C上
递归分析:
第一步:将A上的n-1个盘子移动到B上(不要深究是怎样移动到B上的)
第二步:将A上仅剩的一个盘子由A移动到C上
第三步:将B上的n-2盘子移动到A上
第四步:将B上的仅剩的一个盘子移动到C上
经过分析发现第一步和第三步使用递归
实现代码
void hanoi(int n, char first, char second, char third)
{
if (n <= 1)
move(first,third);
else
{
hanoi(n-1,first,third,second);
move(first,third);
hanoi(n-1,second,first,third);
}
}
int main()
{
hanoi(3,’A’,’B’,’C’);
return 0;
}