Java实现 蓝桥杯 汉诺塔 算法提高

本文详细解析了汉诺塔问题的算法实现,介绍了如何通过递归方式解决汉诺塔问题,包括最少移动次数的计算及具体移动步骤的展示。通过Java代码示例,读者可以深入理解汉诺塔算法的工作原理。

算法提高 汉诺塔

问题描述
  汉诺塔是一个古老的数学问题:
  有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:
  每次只能移动一个圆盘;
  大盘不能叠在小盘上面。
  提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则。

问:如何移?最少要移动多少次?
输入格式
  一行,包含2个正整数,一个是N(N<=15),表示要移动的盘子数;一个是M,表示在最少移动d第M步
输出格式
  共2行。
  第一行输出格式为:#No: a->b,表示第M步骤具体移动方法,其中No表示第M步移动的盘子的编号(N个盘子从上到下依次编号为1到n),表示第M步是将No号盘子从a杆移动到b杆(a和b的取值均为{A、B、C})。
  第2行输出一个整数,表示最少移动步数。
样例输入
3 2
样例输出
#2: A->B
7
数据规模和约定
  0<N<20,0<M<=最小移动步数
这个题涉及到三个盘子间的角色转换。
说明:简化问题就是把 1–N个盘子从源杆A移动到目标杆C,B为辅助,执行每一步计数。等价于:
1、把 1–(N-1)个盘子从源盘A移到 B ,C为辅助;
2、把N 从源盘A移到目标盘C;
3、把1–(N-1)个盘子从B(此时转换为源盘)移动到C,A为辅助;

import java.util.Scanner;

public class Main {
	static int count = 0;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int M = sc.nextInt();
		
		printHanoiTower(N,M,'A','B','C');
		System.out.println(count);
	}

	private static void printHanoiTower(int n, int m, char from, char help, char to) {
		
		if(n == 1){
			count++;
			if(count == m){
				System.out.println("#"+n+":"+" "+from+"->"+to);
			}
			
			return;
		}
		
		printHanoiTower(n-1, m, from, to, help);
		count++;
		if(count == m){
			System.out.println("#"+n+":"+" "+from+"->"+to);
		}
	
		printHanoiTower(n-1, m, help, from, to);
		
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值