经典问题之汉诺塔

汉诺塔问题

汉诺塔其实想深了会觉得复杂,想简单了,你会觉得不可能吧?

这就是算法的乐趣

汉诺塔的递归思想解法很简单,大的问题分解为小的问题求解.

1.假如只有一个盘子,那么直接从A移动到C盘即可
2.假如有两个盘子,那借助B,步骤如下:A->B,A->C,B->C
3.假如有3个甚至更多盘子
可以运用递归思想了,盘子再多,也都是有规律的,上大下小.
移动盘子就容易了:

把除了最后一个盘子外的所有盘子移动到辅助柱子(A->B),
再把最后那个盘子移动到目标柱子上(A->C),
最后再把辅助柱子上的盘子,借助A,移动到C上(B->C),这又是一个递归的过程.

 

代码如下:

 

#include <stdio.h>

void hanoi(int n, char A, char B, char C) {
if(n == 1) {
printf(
"Move sheet from %c to %c\n", A, C);
}
else {
hanoi(n
-1, A, C, B);
hanoi(
1, A, B, C)
hanoi(n
-1, B, A, C);
}
}

int main() {
int n;
printf(
"請輸入盤數:");
scanf(
"%d", &n);
hanoi(n,
'A', 'B', 'C');
return 0;
}

 

 

posted @ 2010-07-20 15:54  东苑草根  阅读(241)  评论(0编辑  收藏  举报
手牵手 一步两步三步 往上爬