汉诺塔问题
汉诺塔其实想深了会觉得复杂,想简单了,你会觉得不可能吧?
这就是算法的乐趣
汉诺塔的递归思想解法很简单,大的问题分解为小的问题求解.
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 ;
}