经典的递归解决方案,汉诺塔问题请自行百度查询,这里不做叙述,直接上代码:
问题要求梗概:
- 每一次只能操作最上层的那个盘子
- 每个小盘子只能放在比它大的盘子上面
- 盘子可以从任何一个木桩上放到任何另一个。
public class Hanoi {
public static void hanoi(int n, int p1, int p2, int p3)//将n个盘子由初始塔移动到目标塔(利用借用塔 {
if(n == 1){
System.out.println("盘子从 "+ p1 + " 移到" + p3);//只有一个盘子是直接将初塔上的盘子移动到目的地
}
else {
hanoi(n-1, p1, p2, p3); //先将初始塔的前n-1个盘子借助目的塔移动到借用塔上
System.out.println("盘子从 "+ p1 + " 移到" + p3);//将剩下的一个盘子移动到目的塔上
hanoi(n-1, p2, p1, p3);//最后将借用塔上的n-1个盘子移动到目的塔上
}
}
public static void main(String[] args) throws IOException {
int num = 0;
String str;
BufferedReader keyIn = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入盘子数量:");
str = keyIn.readLine();
num = Integer.parseInt(str);
hanoi(num, 1, 2, 3);
}
}
p1,p2,p3为三个柱子,所有盘子都由p1移动到p3,p2作为辅助。
运行结果为:
首先它是有一个规律的,总体氛围三个步骤(设总共n个盘子):
1、将n-1个盘子,从p1移动到p2
2、将第n个最大的盘子(最底下),从p1移动到p3
3、将n-1个盘子,从木桩2移动到木桩3
每次递归执行下来其实都会将最大的那个盘子放到目的地(p3)上的,这个问题时很明显的递归逻辑,只要按照这个一直递归最后就会执行完毕。