算法提高 汉诺塔
问题描述
汉诺塔是一个古老的数学问题:
有三根杆子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);
}
}
本文详细解析了汉诺塔问题的算法实现,介绍了如何通过递归方式解决汉诺塔问题,包括最少移动次数的计算及具体移动步骤的展示。通过Java代码示例,读者可以深入理解汉诺塔算法的工作原理。
980

被折叠的 条评论
为什么被折叠?



