汉诺塔问题:
有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,请问怎么移动。
假设只有三个盘子编号为1,2,3具体做法就是:
1盘子从a->b
2盘子从a->c
1盘从b->c
3盘从a->b
1盘从c->a
2盘从c->b
1盘从a->b
三个盘子的移动需要七次,这个是我们通过人脑自己按照想法想出来的
具体编程思想是什么?
基本思想:使用递归,并且需要懂得划分思想
具体划分思想就是,设A盘为起始位置,B盘为终止位置,C盘就是辅助位置
有n个盘子从a到b的具体划分就是:
1.n-1个盘子从a到c 以b盘为辅助
2.把第n个盘子从a到b
3.把剩下的n-1个盘子从c->b 以a为辅助
就可以把盘子从起始位置放置到终止位置,其中不断改变的量就是a,b,c三个位置的身份,比如,从a->c a起始位置 c终止位置 b就是辅助位置 c->b 就是c是起始位置 b是终止位置 a辅助位置 另外一个不断改变的量就是盘子移动的数目,每次移动完成都会少一个需要移动的,把上述变量作为递归函数变化的参数就可以
具体代码如下:
public class Mains{
public static void main(String[] args) {
f(3,"a","b","c");
}
public static void f(int n,String start,String end,String help){
if(n==1){
System.out.println("n="+n+"start:"+start+"->end:"+end);
return;
}
f(n-1,start,help,end);//从起始位置到辅助位置 结束位置作为辅助位置
System.out.println("n="+n+"start:"+start+"->end:"+end);
f(n-1,help,end,start);//把辅助位置变成起始位置到结束位置,把开始位置作为辅助位置
}
}
喜欢的记得点个关注哟!