栈和队列(6)--用栈来求解汉诺塔问题①
2016-10-16 10:01
218 查看
要求:
约束不能从最左侧的塔直接移动到最右侧,也不能从最右侧直接移到最右侧,必须经过中间。求当塔为N层的时候,打印最优移动过程和最优移动总步数。
思考:
用递归的方法--
如果只剩下最上层的塔需要移动,
1.如果希望从“左”移到“中”,打印“Move 1 from left 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 1 from right to mid”和“Move 1 from mid to left”。
多层情况,如果剩下N层,从最上到最小依次为1~N,则:
1.如果剩下的N层都在“左”,希望全部移到“中”,则有三个步骤。
①将1~N-1层塔先全部从“左”移到“右”,利用递归;
②将第N层塔从“左”移到“中”;
③再将1~N-1层塔全部从“右”移动到“中”,利用递归。
2.如果剩下的N层塔从“中”移到“左”,从“中”移到“右”,从“右”移到“中”,过程与情况1同理。
3.如果剩下的N层塔都在“左”,希望全部移到“右”,有五个步骤。
①将1~N-1层塔先全部从“左”移到“右”,利用递归;
②将第N层塔从“左移到”中”;
③将1~N-1层塔全部从“右”移到”左”,利用递归;
④将第N层塔从“中”移到“右”;
⑤最后将1~N-1层塔全部从“左”移动“右”,利用递归。
4.如果剩下的N层塔都在“右”,希望全部放到“左”,过程和3一样。
代码实现:
约束不能从最左侧的塔直接移动到最右侧,也不能从最右侧直接移到最右侧,必须经过中间。求当塔为N层的时候,打印最优移动过程和最优移动总步数。
思考:
用递归的方法--
如果只剩下最上层的塔需要移动,
1.如果希望从“左”移到“中”,打印“Move 1 from left 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 1 from right to mid”和“Move 1 from mid to left”。
多层情况,如果剩下N层,从最上到最小依次为1~N,则:
1.如果剩下的N层都在“左”,希望全部移到“中”,则有三个步骤。
①将1~N-1层塔先全部从“左”移到“右”,利用递归;
②将第N层塔从“左”移到“中”;
③再将1~N-1层塔全部从“右”移动到“中”,利用递归。
2.如果剩下的N层塔从“中”移到“左”,从“中”移到“右”,从“右”移到“中”,过程与情况1同理。
3.如果剩下的N层塔都在“左”,希望全部移到“右”,有五个步骤。
①将1~N-1层塔先全部从“左”移到“右”,利用递归;
②将第N层塔从“左移到”中”;
③将1~N-1层塔全部从“右”移到”左”,利用递归;
④将第N层塔从“中”移到“右”;
⑤最后将1~N-1层塔全部从“左”移动“右”,利用递归。
4.如果剩下的N层塔都在“右”,希望全部放到“左”,过程和3一样。
代码实现:
package algorithm_6; public class algorithm_6 { public static int hanoiProblem1(int num ,String left, String mid, String right){ if(num < 1 ){ return 0 ; } 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(from.equals(mid) || to.equals(mid)){ 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(from.equals(mid) || to.equals(mid)){ 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 " + to); 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 = 1; 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; } } public static void main(String[] args) { String str1 = "left"; String str2 = "mid"; String str3 = "right"; hanoiProblem1(3, str1, str2, str3); } }
相关文章推荐
- 1栈和队列--用栈来求解汉诺塔问题
- 栈和队列(6)--用栈来求解汉诺塔问题②
- 汉诺塔问题(递归求解)
- [python]汉诺塔问题求解
- 汉诺塔问题递归算法求解
- 3-6-汉诺塔(Hanoi Tower)问题-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版
- 用递归算法求解汉诺塔问题
- java-汉诺塔问题求解
- C语言实现Hanoi(汉诺塔)问题的递归求解
- 用栈和队列求解迷宫问题
- JAVA求解汉诺塔问题
- 数据结构:栈和队列-迷宫问题求解
- java中使用递归求解汉诺塔问题
- 汉诺塔问题求解
- 学习C/C++语言:递归求解hanoi汉诺塔问题
- 利用启发式搜索算法求解3阶汉诺塔问题
- 3-6-汉诺塔(Hanoi Tower)问题-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版
- C语言:汉诺塔问题求解
- 迷宫最短路径问题(ShortestPath)的求解——利用链式队列
- 汉诺塔问题递归求解