经典问题之汉诺塔

汉诺塔问题

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

这就是算法的乐趣

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

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 ;
}

 

 

你可能感兴趣的:(问题)