解决汉诺塔问题的思路:
-
如果只有一个金片,则把该金片从源移动到目标棒,结束。
-
如果有n个金片,则把前n-1个金片移动到辅助的棒,然后把自己移动到目标棒,最后再把前n-1个移动到目标棒。
对于汉诺塔问题的求解,可以通过以下三个步骤实现:
-
将塔A上的n-1个碟子借助塔C先移到塔B上。
-
把塔A上剩下的一个碟子移到塔C上。
-
将n-1个碟子从塔B借助塔A移到塔C上。
C版本
#include<stdio.h> void move(int n,char a,char b,char c) { if(n==1) printf(" %c->%c ",a,c); //当n只有1个的时候直接从a移动到c else { move(n-1,a,c,b); //第n-1个要从a通过c移动到b printf(" %c->%c ",a,c); move(n-1,b,a,c); //n-1个移动过来之后b变开始盘,b通过a移动到c,这边很难理解 } } main() { int n; printf("请输入要移动的块数:"); scanf("%d",&n); move(n,'a','b','c'); }
java版本
public static void main(String args[]) throws Exception { int n = 3; Test test = new Test(); test.move(n, 'A', 'B', 'C'); } public void move(int n, char a, char b, char c) { if (n == 1){ System.out.println("num: " + n + " from " + a + " to " + c); }else { move(n - 1, a, c, b); System.out.println("num: " + n + " from " + a + " to " + c); move(n - 1, b, a, c); } }