漢諾塔運用到了分治的思想,把一個完整的塔給拆分成了兩個部分:
假設一個塔有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; }