汉诺塔问题II

来源:互联网 发布:linux depth 编辑:程序博客网 时间:2024/05/17 03:00

今天看了一本书上的一个汉诺塔问题,和原本的汉诺塔问题有点不一样,就记录了下来。

package com.an.stack;/* * 汉诺塔问题(II) *   这里的汉诺塔修改了游戏规则,现在限制不能直接从左边的塔放到最右边,也不能从右边直接放到 *    左边,而是必须要经过中间.问:当有N层时,写出打印出的移动过程和最优移动的步数 *  * 分析:如果剩下N层塔,从上到下一次为1~N,则有如下判断: * 1.如果剩下N层塔都在左边,希望全部放到中,则有三个步骤 * ① 将1~N层塔从左边放到右边,利用递归 * ② 再将第N层塔从左边放到中间 * ③ 再将N-1层塔从右边放到中间 * 2.如果剩下N层塔从“中”移到“左”,从“右”移到“中”,从“中”移到“右”,方法和1过程一样 *   也分为3个步骤。 * 3.如果剩下的N层塔都在左,希望移到右边.共分为5个步骤 * ① 将N-1层塔全部移到右边,利用递归 *  ② 将第N层塔从左移到中。 *  ③ 将N-1层塔全部由右全部移到左边 *  ④ 将第N层塔从中移到右 *  ⑤ 将N-1层塔从左全部移到右,利用递归 * 4.如果剩下的N层塔都在右,希望移到左边.共分为5个步骤,和情况三一样 *  */public class HanioProblem1 {static int i=1;public static void main(String[] args) {HanioProblem1 hanio = new HanioProblem1();hanio.hanioProblem(2, "A", "B", "C");System.out.println("共需要"+ (i-1) +"步");}public int hanioProblem(int n,String left,String mid,String right){if(n < 0){return 0;}return process(n,left,mid,right,left,right);}private int process(int n, String left, String mid, String right, String from, String to) {if(n == 1){if(from.equals(mid) || to.equals(mid)){System.out.println("Move 1 from "+from + " to " + to  +" 第"+(i++)+"步");return 1;}else{System.out.println("Move 1 from "+from + " to " + mid+" 第"+(i++)+"步");System.out.println("Move 1 from "+mid + " to " + to+" 第"+(i++)+"步");return 2;}}if(from.equals(mid) || to.equals(mid)){String another = (from.equals(left))||(to.equals(left))? right:left;int part1 = process(n-1, left, mid, right, from, another);int part2 = 1;System.out.println("Move "+n+" from "+from+" to "+to+" 第"+(i++)+"步");int part3 = process(n-1, left, mid, right, another, to);return part1 + part2 + part3;}else{int part1 = process(n-1, left, mid, right, from, to);int part2 = 1;System.out.println("Move " +n+" from "+ from + " to "+mid+" 第"+(i++)+"步");int part3 = process(n-1, left, mid, right, to, from);int part4 = 1;System.out.println("Move "+n+" from "+mid + " to "+right+" 第"+(i++)+"步");int part5 = process(n-1, left, mid, right, from, to);return part1+part2+part3+part4+part5;}}}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 想做主持人但不是播音专业怎么办 动脉造影术2天后穿刺点出血怎么办 战舰世界买了重复金币船怎么办 戒指戴在手上取不下来怎么办 工作中难以和同事上司相处怎么办 老是被上司和同事欺负我该怎么办 桌面太低座位太高写字不舒服怎么办 一个人如果欠下网贷无法偿还怎么办 c语言的编译和运行不见了怎么办 8k纸的国庆节手抄报怎么办 合同员工签字了老板一直未签怎么办 下体长毛了很多肉芽很痒怎么办 对方拟把假离婚协议弄假成真怎么办 领主之塔改版后旧材料怎么办 汽车遥控钥匙打不开车门怎么办 苹果手机访问限制密码忘了怎么办 苹果的访问限制密码忘了怎么办 手机下雨天进水声音出了问题怎么办 胸太小了该怎么办经常揉胸会变大吗 鼻冲洗器冲鼻子耳朵进水怎么办 手表进水了然后里面有水珠怎么办 玩游戏后头晕恶心想吐怎么办 吃完美林3小时后又发烧怎么办 颜值和身材都是负分怎么办 妈妈离婚又有一个孩子我该怎么办 孩子妈妈天天给孩子吃药我该怎么办 被像蚂蚁有翅膀的虫子咬了怎么办 1周半宝宝扭脚丫肿了怎么办 离婚后前夫带孩子走了找不到怎么办 宜昌全视之眼逃出卢浮宫怎么办 qq号被盗了密保手机也被改怎么办 乐视盒子控播平台认证怎么办 购买冲气娃娃被发现了怎么办 买了充气娃娃太美舍不得扔怎么办 一品官老爷账号密码忘了怎么办 苹果手机加声音显示出耳机怎么办 被删除的照片恢复后效果变差怎么办 w10系统玩刺激战场声音小怎么办 宝宝不咳嗽但是喉咙有痰怎么办 深圳限行如果车堵在路上怎么办 奔跑吧qq中奖我填写资料怎么办