河内之塔【C++版】
@輸入盤數,輸出此類的方法詳解過程。
-編碼裝置:Dev;
- 分析:類型的确定,主函數,子函數(if判斷,進行排序);
-
見詳解:大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞着64片黃金圓盤。大梵天指令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次隻能移動一個圓盤。一天移動一個圓盤,當圓盤全部移動另一個柱子上時宇宙就将毀滅。有三根相鄰的柱子,标号為A,B,C,A柱子上從下到上按金字塔狀疊放着n個不同大小的圓盤,要把所有盤子一個一個移動到柱子B上,并且每次移動同一根柱子上都不能出現大盤子在小盤子上方,請問至少需要多少次移動,設移動次數為H(n)。
步驟:
當n=1時,H(1)=1,即A—>C;
當n=2時,H(2)=3,即A—>B,A—>C,B—>C;
當n>2時,可以将第1個盤子到第n-1個盤子看成一個整體為①,這樣就仍為兩個盤子:
第一步:①從A—>B:共H(n-1)步;
第二步:n 從A—>C:共1步;
第三步:①從B—>C:共H(n-1)步.
- 優勢:方法簡明;
- 劣勢:未達到一定程度上的創新;
- 歡迎各位小可愛提出問題與看法與up主進行溝通與交流!
具體代碼如下;
#include<stdio.h>
void tower(int n,char A,char B,char C)
int main(void)
{
int n;
printf("\tPlease input a traies :");
scanf("%d",&n);
tower(n,'A','B','C');
return 0;
}
void tower(int n,char A,char B,char C)
{
if(n ==1)
{
printf("\tremove %c, from %c to %c\n",n,A,C);
}
else
{
tower(n - 1,A,C,B);
printf("\tremove %c, from %c to %c\n",n,A,C);
tower(n - 1,B,A,C);
}
}
運作結果如下: