Javaの:ハノイ問題
タイトル
问题描述
如果将课本上的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);
}
}
最初のアルゴリズムは= 1、プレートからのみこれらA、ラインC上を移動する非常にシンプルであり、場合nは
n個のディスクが場合、その後
N-1、A-Bから移動させてはCを意味します列には、目標はBピラーであることを、同じ目標ではありません
次いで、第n列とは、Aに移動した後、Cを表します
N-1は、これらのプレートは、プレートがC Bに移動最後の移動であります
私は再帰を書いていません
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
}
}