用栈求解汉诺塔问题(每日一道算法题)

来源:互联网 发布:知乎匿名回答在哪看 编辑:程序博客网 时间:2024/05/16 09:04

今天的题目有点难,所以只理解了一点,但是为了记录自己每天都有收获,还是将我理解的部分贴出来:

首先,如果只剩最上层的塔需要移动,则有如下处理:
1.如果希望从“左”移到“中”,打印“Move 1 from lef to mid”.
2.如果希望从“中”移到“左”,打印“Move 1 from mid to left”.
3.如果希望从“中”移到“右”,打印“Move 1 from mid to right”.
4.如果希望从“右”移到“中”,打印“Move 1 from right to mid”
5如果希望从“左”移到“右”,打印“Move 1 from left to mid” 和“Move 1 from mid to right”
6.如果希望从“右”移到“左”,打印“Move 1fromrighttomid” 和“Move 1 from mid to left”
以上过程就是递归的终止条件,也就是只剩上层塔时的打印过程。
接下来,我们分析剩下多层塔的情况。
如果剩下N层塔,从最上到最下依次为1~N,则有如下判断:
1.如果剩下的N层塔都在“左”,希望全部移到“中”,则有三个步骤。
1) 将1~N-1层塔先全部从“左”移到“右”,明显交给递归过程。
2) 将第N层塔从“左”移到“中”。
3) 再将1~N-1层塔全部从“右”移到“中”,明显交给递归过样。.
从“右”移到“
2.如果把剩下的N层塔从“中”移到“左”,从“中”移到“右,
过程与情况1同理,一样是分解为三步,在此不再详述。
则有五个步骤。
3.如果剩下的N层塔都在“左”,希望全部移到“右”,

1) 将1~N-1层塔先全部从“左”移到“右”,明显交给递归过程。
2) 将第N层塔从“左”移到“中”。
3) 将1~N-1层塔全部从“右”移到“左”,明显交给递归过程。
4) 将第 N层塔从“中”移到“右”。
5) 最后将1~N-1层塔全部从“左”移到“右”,明显交给递归过程。

4.如果剩下的N 层塔都在“右”,希望全部移到“左”,过程与情况3 同理,一样
为五步,在此不再详述。

public static int hanio(int num,String left,String mid,String right) {        if(num<1) {            return 0;        }else {            return process(num,left,mid,right,left,right);//从左到右        }    }    public static int process(int num,String left,String mid,String right,String from,String to) {        if(num==1) {            if("mid".equals(from)||"mid".equals(to)) {                System.out.println("move 1 from "+from+"to"+to);                return 1;            }else {                System.out.println("move 1 from"+from+"to"+mid);                System.out.println("move 1 from"+mid+"to"+to);                return 2;            }        }        if("mid".equals(from)||"mid".equals(to)) {            String another = (from.equals("left")||to.equals("left"))?right:left;            int part1 = process(num-1,left,mid,right,from,another);            int part2 = 1;            System.out.println("move "+num+ " from"+from+"to"+another);            int part3 = process(num-1,left,mid,right,another,to);            return part1+part2+part3;        }else {            int part1 = process(num-1,left,mid,right,from,to);            int part2 = 2;            System.out.println("move "+num+" from"+from+"to"+mid);            int part3 = process(num-1,left,mid,right,to,from);            int part4 = 1;            System.out.println("move "+num+" from"+mid+"to"+to);            int part5 = process(num-1,left,mid,right,from,to);            return part1+part2+part3+part4+part5;        }    }

未完待续。。。。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 看门狗2枪没子弹怎么办 爱奇艺不小心删除了本地视频怎么办 80岁老太太就爱闹肚子怎么办? 皇牌空战5弹药不够怎么办 辐射4玩着头晕怎么办 官司打赢了法院不给钱怎么办 电脑玩dnf太卡怎么办 soul被禁止私聊怎么办 刺激战场空投挂树上怎么办 由于经济原因心态不好怎么办 公司经济不好不裁员怎么办 家里经济不好没有钱怎么办 银行柜员找不到工作怎么办 在球队中打替补怎么办 大学生毕业后找不到工作怎么办 30岁不敢换工作怎么办 投完简历没回复怎么办 工业废气一年总量超标怎么办 安监局行政处罚没能力交怎么办 被社会淘汰的人怎么办 宝宝吐奶的时候怎么办 网友要我发红包怎么办 电脑久了很慢怎么办 影驰显卡花屏怎么办 反恐精英全球攻势加载地图慢怎么办 老滚5视角锁死了怎么办 苹果描述文件没有了怎么办 苹果6s发热严重怎么办 苹果6s发烫严重怎么办 手机型号不适配全军出击怎么办? 苹果5版本过低怎么办 在泰国买到假货怎么办 在泰国旅游遇到危险该怎么办? 拾到小米手环怎么办 苹果充电打游戏触点怎么办 衣服上金属锈了怎么办 光之子门锁住了怎么办 挖到金矿石了该怎么办 邻居是精神病扔石头怎么办 汽车保养手册丢了怎么办 五号电池没电了怎么办