006-递归实现汉诺塔问题

package com.my.suanfa;
/*
 * 用栈来求解汉诺塔问题的两种方法
 * 方法一:递归实现
 * 方法二:非递归实现,用栈来模拟递归,因为递归的本质上也是栈
 * 前提条件:不能直接从左移动到右,也不能从右直接移动到左,而是必须经过中间
 * */
public class Solution02 {
	/*
	 * 方法一:递归实现n层汉诺塔
	 * 递归的结束条件:只剩一层,第n层,一共8种情况,分成两类
	 * 			1.left-->mid, right-->mid, mid-->left, mid-->right,
	 * 				相同点:起始柱子和目标柱子相邻,起始柱子或
	 * 							者目标柱子其中有一个柱子必是mid
	 * 				判断条件:from.equals(mid) || to.equals(mid)
	 * 				移动过程:直接将此层from-->to,需要1步完成
	 * 			2.left-->right, right-->left
	 * 			移动过程:from-->mid,mid-->to,需要2步完成
	 * 递归继续条件:递归移动1--n层,一共8种情况,分成两类
	 * 			1.left-->mid, right-->mid, mid-->left, mid-->right,
	 * 				相同点:起始柱子和目标柱子相邻,起始柱子或
	 * 							者目标柱子其中有一个柱子必是mid
	 * 				判断条件:from.equals(mid) || to.equals(mid)
	 * 								因为移动过程中是动态变化的,所以辅助柱子another是不定的,
	 * 								another = (from.equlas(left) || to.equlas(left))) ? right : left
	 * 				移动过程:将1--n-1层:from-->anather,递归实现
	 * 									将第n层:from-->to,需要1步完成
	 * 									将1--n-1层:another-->to,递归实现
	 * 			2.left-->right, right-->left
	 * 				移动过程:将1--n-1层:from-->to,递归实现
	 * 									将第n层:from-->mid,需要1步
	 * 									将1--n-1层:to-->from,递归实现
	 * 									将第n层:mid-->to,需要1步
	 * 									将1--n-1层:from-->to,递归实现
	 * 		
	 * */
	public int hanioProblem1(int num, String left, String mid, String right) {
		if(num < 1) {
			return 0;
		}
		return process(num, left, mid, right, left, right);
	}
	
	public 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 anather = (from.equals(left) || to.equals(left)) ? right : left;
			int part1 = process(num - 1, left, mid, right, from, anather);
			int part2 = 1;
			System.out.println("move " + num + " from" + from + " to " + to);
			int part3 = process(num - 1, left, mid, right, anather, 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;
		}
	}
	
}

猜你喜欢

转载自blog.csdn.net/xiongmengyao/article/details/89489570