C語言 漢諾塔問題


漢諾塔運用到了分治的思想,把一個完整的塔給拆分成了兩個部分:

假設一個塔有n各部分,那么將其分為兩個部分:前n-1塊為上半部分,第n個(即最下面一個為下半部分)

 

 

想要把上下兩層的漢諾塔完整的移動到第三個軸處,只需要將上一層(n-1層)先從A柱借助C柱移動到B柱,然后把下半層(n層)移動到C柱,最后將放在B柱上的n-1層借助A柱放到C柱上,那么整個過程就成功了

第一步,先將上面n-1層(假設一共有n層)借助C柱全部放到B上:因為上層必須經過C才能按上小下大的順序全部放到B上,所以這里強調必須經過C柱。

偽代碼可表示為:hanoi(n-1,A,C,B)//n-1層從A借助C移動到B

 

 

 

第一步 移動結束:

 

第二步:把A柱剩下的最大塊直接移動到C柱:偽代碼就相當於move(A,C)

 

 

 第三步:把B柱的n-1層借助A柱全部按上小下大移動到C上面(必須說明的是因為B上的n-1塊板子如要按照上小下大的順序完整的移動到C上面一定是要經過A這個柱子的。從分治的角度出發說明,中間的某些塊必定要經過B,只是由於把整體分成了兩大塊所以忽視了,但是寫代碼的時候一定是要寫上的)

偽代碼可表示為hanoi(n-1,B,A,C)

 

 中間必定會從A再到C

 

落到A以后再到C

 

 

 

 這就是完整的漢諾塔移動規律

 代碼可以寫為

#include<stdio.h>
void hanoi(int n,char A,char B,char C)
{
    if(n==1)
        printf("%c->%c\n",A,C);//遞歸出口,如只有一個塊,直接從A到C就可以了 
    else
    {
        hanoi(n-1,A,C,B);//首先把n-1塊板子們全部從A借助C移動到B 
        printf("%c->%c\n",A,C);//接着再把處於A的第n層移動到C 
        hanoi(n-1,B,A,C);//最后再把處於B的n-1塊板子們借助A全部移動到C 
    }//漢諾塔完成 
}
int main()
{
    hanoi(3,'A','B','C');
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM