漢諾塔問題II

今天看了一本書上的一個漢諾塔問題,和原本的漢諾塔問題有點不一樣,就記錄了下來。

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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章