遞回做漢諾塔——怎么樣顯示出遞回的層數呢
如圖

本小白只做得出下面這樣

求教了,想要學習一下。
uj5u.com熱心網友回復:
在遞回的引數里加一個 last 表示上次移動的盤子,f 表示遞回層數即可。希望得到幫助,代碼自行思考。
uj5u.com熱心網友回復:
思路挺簡單的,就是用一些指標變數記錄移動次數,遞回層數,和盤子編號就行了給你寫個例子,偷懶了把指標變數改用陣列,陣列長度也省略了
遞回的思路就不說明了,各種漢諾塔的程式都有解釋說明,這里解釋一下移動次數和遞回層數
void han(int n, char a, char b, char c, int *info) {
if (n==1) {
info[0]++; //每次移動時移動次數遞增
printf("第%d步: 將%d號盤子從%c移動到%c\n", info[0], info[2]-info[1]+1, a, c); //列印移動情況,盤子編號看main方法解釋
} else {
printf("在第%d層呼叫第一個遞回進入第%d層\n", info[1], info[1]+1); //列印第一次呼叫遞回層數
info[1]++; //呼叫遞回前遞回層數遞增
han(n-1, a, c, b, info); //然后呼叫遞回(在遞回結束后,遞回層數要記得遞減)
printf("回傳第%d層\n", --info[1]); //呼叫遞回結束后遞回層數遞減,然后列印回傳層數
info[0]++; //每次移動完時移動次數遞增
printf("第%d步: 將第%d號盤子從%c移動到%c\n", info[0], info[2]-info[1]+1, a, c); //列印移動情況
printf("在第%d層呼叫第二個遞回進入第%d層\n", info[1], info[1]+1); //列印第二次呼叫遞回層數
info[1]++; //呼叫遞回前遞回層數遞增
han(n-1, b, a, c, info); //然后呼叫遞回(在遞回結束后,遞回層數要記得遞減)
printf("回傳第%d層\n", --info[1]); //呼叫遞回結束后遞回層數遞減,然后列印回傳層數
}
}
int main(int argc, const char * argv[]) {
char a='A', b='B', c='C';
int n, info[3] = {0, 1, 0}; //陣列第一個元素是移動次數,第二個是遞回層數,第三個是總盤子數(總盤子數-遞回層數+1=盤子編號)
printf("請輸入盤子個數:\n");
scanf("%d", &n);
info[2] = n; //設定盤子數
printf("盤子移動情況如下:\n");
han(n, a, b, c, info);
printf("共移動了%d次:\n", info[0]);
return 0;
}
uj5u.com熱心網友回復:
嗯嗯 已經做出來了 感謝各位 自己的代碼貼上:#include <stdio.h>
#include <stdlib.h>
int i=1;
int layer=1;
void hanoi(char src, char mid, char dst, int n)
{
if (n == 1) {
printf("第%d步:將%d號盤子從%c移動到%c\n",i++,n, src, dst);
printf("回傳第%d層\n",--layer);
}
else
{
printf("呼叫第一個遞回進入第%d層\n",++layer);
hanoi(src, dst, mid, n - 1);
printf("第%d步:將%d號盤子從%c移動到%c\n",i++,n, src, dst);
printf("呼叫第二個遞回進入第%d層\n",++layer);
hanoi(mid, src, dst, n - 1);
if(layer!=1)
printf("回傳第%d層\n",--layer);
}
}
int main(void)
{
int n;
printf("請輸入盤子的個數\n");
while (scanf("%d", &n) != EOF)
{
printf("盤子移動情況如下:\n");
hanoi('A', 'B', 'C', n);
printf("一共需要%d步\n",i-1);
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/93103.html
標籤:C語言
上一篇:求教,關于c++解構式
