您的位置:首页 > 其它

栈和队列(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一样

代码实现:

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);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: