今天看了漢諾塔問題,在一本書上簡單了看了個大概,沒有深入的瞭解。先記上。
#include<stdio.h>
/*
漢諾塔問題。
有n個盤子,有三根石柱,n個盤子從上到下依次爲從小到大的盤子,而且在第一個石柱上面,
問題:把一個石柱上面的盤子移到第三個上面,而且一次只能移動一個,移動時小盤子必須
放在大盤子上面。求最後移動的整個過程,和
我們把n個盤子從A柱移動到C柱,問題可以變爲:
Hanio(n,A,B,C)
該問題可以分解爲以下子問題:
第一步:將n-1個盤子從A柱移動至B柱(藉助C柱爲過渡柱)
第二步:將A柱底下最大的盤子一定至C柱
第三步:將B柱的n-1個盤子移至C柱(藉助A柱爲過渡柱)
最後的步數爲:(2^n)-1
*/
int i;//記錄步數
//表示進行的步數,將編號爲n的盤子由from柱移動到to柱(目標柱)
void move(int n,char from,char to){
printf("第%d步,將%d號盤子%c--->%c\n",i++,n,from,to);
}
//漢諾塔遞歸函數
void Hanio(int n,char pos_start,char pos_trans,char pos_end){
//當n=1時,表示就有一個盤子,直接從起始柱移動到目標柱上面
if(n == 1){
move(n,pos_start,pos_end);
}else{
// 遞歸開始,我們要把最大的一個盤子移動到第三個柱子上面,n-1個盤子 在第二個盤子上面,所以此時第三個爲過渡柱
//所以把pos_trans放到第三個位置,pos_end放到第二個位置。
Hanio(n-1,pos_start,pos_end,pos_trans);
move(n,pos_start,pos_end);
//這是第一個柱子爲空,變爲過渡柱,最後一個柱子上面放着最大的盤子
Hanio(n-1,pos_trans,pos_end,pos_start);
}
}
int main(){
i = 1;
Hanio(4,'1','2','3');
printf("最後總共的步數是:%d\n",i-1);
}
執行結果如下: