java:Hanoi问题
题目
问题描述
如果将课本上的Hanoi塔问题稍做修改:仍然是给定N只盘子,3根柱子,但是允许每次最多移动相邻的M只盘子(当然移动盘子的数目也可以小于M),最少需要多少次?
例如N=5,M=2时,可以分别将最小的2个盘子、中间的2个盘子以及最大的一个盘子分别看作一个整体,这样可以转变为N=3,M=1的情况,共需要移动7次。
输入格式
输入数据仅有一行,包括两个数N和M(0<=M<=N<=8)
输出格式
仅输出一个数,表示需要移动的最少次数
样例输入
5 2
样例输出
7
import java.util.Scanner;
public class Hanoi {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
double n=sc.nextDouble();
double m=sc.nextDouble();
double c=Math.ceil(n/m);
double result=Math.pow(2, c);
System.out.println((int)result-1);
}
}
第一个算法很简单,就时当n=1时,只需要将这一个盘子从A,移到C就行
之后,当n个盘子时
先让n-1先从A借助C移到B,这是目标柱子不一样,这个目标柱子是B
之后再移动第n个柱子表示A到C
最后就是移动n-1这些盘子,把B中的盘子移到C
用递归方法没写出来
import java.util.Scanner;
public class Hanoi1 {
public static int n;
public static int m;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
m=sc.nextInt();
int A,B,C;
f(n,A,B,C);
}
private static void f(int q, int a, int b, int c) {
// TODO Auto-generated method stub
if(q<m)
move(q,a,c,b);
else{
f(m,a,c,b);
move(q,a,c);
f(q-m,b,a,c);
}
}
private static void move(int q, int a, int c, int b) {
// TODO Auto-generated method stub
}
}