试题 算法提高 汉诺塔

试题 算法提高 汉诺塔

问题描述
  汉诺塔是一个古老的数学问题:
  有三根杆子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<=最小移动步数

import java.util.Scanner;

public class Main {

	static int bu=0;
	static int m;
	public static void main(String[] args) {
	      Scanner sc = new Scanner(System.in);
	      int n=sc.nextInt();	   
	      m=sc.nextInt();
	      hanio('A','B','C',n);
	      System.out.println(bu);
	      
	}
	
	static void hanio(char A, char B, char C, int n) {
		
		if(n==1) {
			bu++;
			if(bu==m)
			   System.out.println("#"+n+": "+A+"->"+C);
			return;
		}
		
		hanio(A, C, B, n-1);
		bu++;
		if(bu==m)
		    System.out.println("#"+n+": "+A+"->"+C);
		hanio(B, A, C, n-1);
	}	
}
/*
3 2
A->C 1   1
A->B 2   2
C->B 1   3
A->C 3   4
B->A 1   5
B->C 2   6
A->C 1   7
7

*/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值