Javaの:ハノイ問題

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
		
	}

}

公開された146元の記事 ウォンの賞賛3 ビュー2789

おすすめ

転載: blog.csdn.net/weixin_44522477/article/details/104554428