今天的题目有点难,所以只理解了一点,但是为了记录自己每天都有收获,还是将我理解的部分贴出来:
首先,如果只剩最上层的塔需要移动,则有如下处理:
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;
}
}
未完待续。。。。