汉诺塔游戏
游戏简介
如图:游戏开始时应该有三条柱子,而我们需要做的就是把A柱子上的所有原盘转移到另一个指定的柱子C上,在此过程中原盘需要满足小原盘在大圆盘的上面。
实例
如图,此时需要把A柱上的所有原盘放到C上的步骤依次应该为:
A->C
A->B
C->B
A->C
B->A
B->C
A->C
代码思路
实例1:n=1时,A->C
实例2:n=2时,A->B,A->C,B->C
实例3:n=3时,A->C,A->B,C->B,A->C,B->A,B->C,A->C
如上例,当A柱上有n个盘子时,我们需要把这n-1个盘子通过C柱挪到B柱上,再把A柱上最大的那个盘子挪到C上,然后把B柱上这n-1个盘子通过A挪到C上,此时把n-1看成新的n,B柱就是新的A柱,把B柱上的n-1个盘子通过A柱挪到C上,也就是把新A柱上的新n个盘子通过新B柱挪到C上。
如图:
则在n>1时,所有的操作可以看成3步
把n个盘子从A通过B挪到C;目的
只需要把n-1个盘子从A通过C挪到B; 第一步
A上剩余的最后一个盘子再挪到C; 第二步
然后把这n-1个盘子从B通过A挪到C; 第三步,此时与刚开始一样,重复操作(此时只是目的的n变成了现在的n-1,从A通过B变成了现在的从B通过A,所以只需要修改n的值,再将A、B柱子的名字互换继续循环执行即可,知道n为1时。再直接挪到C柱即可)
代码
public class Hanoi {
public static void move(char x,char y){
System.out.println(x + "->" + y);
}
public static void func(int n,char pos1,char pos2 ,char pos3){
if (n == 1){
move(pos1,pos3);
return;
}
func(n - 1,pos1,pos3,pos2);
move(pos1,pos3);
func(n - 1,pos2,pos3,pos1);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入A柱上的原盘数");
int n = sc.nextInt();
func( n , 'A','B','C');
}
}
测试截图
实例1:
实例2:
实例3: