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

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

首先,如果只剩最上层的塔需要移动,则有如下处理:
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;

        }


    }

未完待续。。。。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值