算法 -野人傳教士過河

package MBC;

import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;

import javax.crypto.Mac;

class strack extends LinkedList {// 堆棧

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public boolean isEmpty() {
		return super.isEmpty();
	}

	public Object pop() {
		if (!this.isEmpty())
			return removeFirst();
		return "null";
	}

	public void push(Object e) {
		super.addFirst(e);
	}

}

class left {
	int m;// 傳教士

	int c;// 野人

	int b;// 船

	boolean flag = true;

	public int getM() {
		return m;
	}

	public void setM(int m) {
		this.m = m;
	}

	public int getC() {
		return c;
	}

	public void setC(int c) {
		this.c = c;
	}

	public boolean isFlag() {
		return flag;
	}

	public void setFlag(boolean flag) {
		this.flag = flag;
	}

	public int getB() {
		return b;
	}

	public void setB(int b) {
		this.b = b;
	}

	public left(int m, int c, int b) {
		super();
		this.m = m;
		this.c = c;
		this.b = b;
	}

}

public class MCB {

	public static void main(String[] args) {

		left[] all = new left[16];// 合法狀態集合
		all[0] = new left(0, 0, 0);
		all[1] = new left(0, 1, 1);
		all[2] = new left(0, 2, 1);
		all[3] = new left(0, 3, 1);
		all[4] = new left(1, 1, 1);
		all[5] = new left(2, 2, 0);
		all[6] = new left(3, 1, 1);
		all[7] = new left(3, 2, 1);
		all[8] = new left(0, 1, 0);
		all[9] = new left(0, 2, 0);
		all[10] = new left(1, 1, 0);
		all[11] = new left(2, 2, 1);
		all[12] = new left(3, 0, 0);
		all[13] = new left(3, 1, 0);
		all[14] = new left(3, 2, 0);
		all[15] = new left(3, 3, 1);

		left start = all[15]; // 開始狀態
		all[15].setFlag(false);
		boolean flag = false;
		strack strack = new strack();
		strack.push(all[15]);

		MCB test = new MCB();
		test.doit(strack, all);

	}

	void doit(strack st, left[] all) {
		Iterator s = st.iterator();
		left shang = null;
		shang = (left) st.getFirst();



		
		if (st.getFirst().equals(all[0])) {// 輸出

			System.out.println("完成一個");
			left hh = null;
			while (s.hasNext()) {
				hh = (left) s.next();
				System.out.print(hh.getM() + " " + hh.getC() + " " + hh.getB()
						+ "   <-- ");

			}

		}
			

		for (int i = 14; i >= 0; i--) {
			
			

			if ((all[i].flag == true)// 符合操作
					&& (shang.getB() != all[i].getB())
					&& (shang.getC() + shang.getM() != all[i].getC()
							+ all[i].getM())
					&& (Math.abs(all[i].getM() - shang.getM())
							+ Math.abs(all[i].getC() - shang.getC()) <= 2)

			) {
				if ((all[i].getB() == 1 && ((all[i].getC() + all[i].getM()) > (shang
						.getC() + shang.getM()))

				)
						|| (

						all[i].getB() == 0 && ((all[i].getC() + all[i].getM()) < (shang
								.getC() + shang.getM()))

						)) {

					shang = all[i];
					
					
					all[i].flag = false;
					st.push(all[i]);
					
					doit(st, all);
					all[i].flag = true;
					st.pop();
					shang=(left)st.getFirst();
				
				}
			}// 符合操作

		}

	}
}

 

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