河内之塔游戏规则:有A、B、C三个石棒,A上有若干个从小到大依次排列的盘子,盘子的数量为n,现在要求,将A棒上的盘子依次移动到C棒上,并且移动过程中要保证小盘在大盘之上。
(1)当n=1时:将盘子直接从A移动到C;( 注:图片来源于https://www.cnblogs.com/li-peng/p/3303349.html,图片有修改,原作者使用的是c和c++,感兴趣的读者可以去看一下)
图一
(2)当n=2时:将小盘子1从A移动到B;
将大盘子2从A移动到C;
将小盘子1从B移动到C;
图二
(3)当n=3时:将盘子1从A移动到C;
将盘子2从A移动到B;
将盘子1从C移动到B;
将盘子3从A移动到C;
将盘子1从B移动到A;
将盘子2从B移动到C;
将盘子1从A移动到C;
图三
解题思路:当n=3时:(1)将1和2盘子看成一个盘子,利用图二就可完成盘子从A移动到C的移动操作;
(2)A移动到C的过程中,先是把盘子1和2是看成一个盘子移动到B棒上的。那么就来看看这一部分怎么移动到B盘上的,将A和B棒位置互换,并且将A,B棒位置以及名字互换,再将更换后的B棒和C棒位置互换,那么通过图五,A棒便可以完成盘子1和2移动到B棒上。(递归思想)
图四 第(1)步移动
图五
当n=n(多余三个的)时候,重复的将盘子分为最下边一个盘子分为第一部分,将剩下的所有上边的盘子分成第二部分,多次重复图二操作,便可以完成盘子从A移动到C的操作;
代码和打印结果如下:
import java.util.Scanner;
public class Towers_of_Hanoi {
public static void main(String[] args) {
int n;
Scanner scanner = new Scanner(System.in);
System.out.println("请输入盘数:");
if (scanner.hasNextInt()) {
n = scanner.nextInt();
data(n,"A","B","C");
}else {
System.out.println("请输入正确数字");
}
}
public static void data(int n,String A,String B,String C) {
if(n==1) {
System.out.println(A+">>"+C);
}else {
data(n-1,A,C,B);
System.out.println(A+">>"+C);
data(n-1,B,A,C);
}
}
}
打印结果1:
打印结果2:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)