JAVA數據結構學習2.2利用回溯法解決迷宮問題,並把路徑輸出

回溯的思路

回溯法的根本思想就是每次都寫出全部的解決方法,然後通過下一步的正確與否來決定每個解決方法是否有效,下一步又把全部解決方法寫出來,每個解決方法又根據下下步能否有效來決定,最終直到找到最後一步,再開始回溯,注意最終執行順序是由最後一步開始倒着執行。

本題的思路

每一步都有四個方向,i+1向下走,i-1向上走,j+1向右走,j-1向左走,每一步都可能會走到邊緣、牆和走過的結點,因此需要提前判斷,若現在要走的位置不是已經走過的也不是界外也不是牆,則可以繼續走,然後進行上下左右四個方向走。
最終路徑一定是反着的,因此可以利用棧內後入先出的特性,最終通過出棧來打印路徑

package primDataStructure;

import java.util.Stack;
//回溯法走迷宮
public class laby {
	int l[][];
	Stack<String> stack=null;
	public laby() {
		l=new int[4][5];
		l[0][0]=1;
		l[1][0]=1;
		l[1][1]=1;
		l[1][2]=1;
		l[1][3]=1;
		l[2][1]=1;
		l[2][3]=1;
		l[3][3]=1;
		l[3][4]=1;
		stack=new Stack<String>();
	}
	public boolean setWays(int way[][],int i,int j) {
		if(i>=0&&j>=0&&i<=3&&j<=4) {
		if(i==3&&j==4) {
			stack.push("已經走到盡頭");
			return true;
		}
		else if(way[i][j]==1) {
			way[i][j]=2;
			if(setWays(way,i+1,j)) {
				stack.push("走到"+i+""+j);
			return true;
			}
			if(setWays(way,i,j+1)) {
				stack.push("走到"+i+""+j);
				return true;
			}
			if(setWays(way,i-1,j)) {
				stack.push("走到"+i+""+j);
				return true;
			}
			if(setWays(way,i,j-1)) {
				stack.push("走到"+i+""+j);
				return true;
			}
			
			return false;
		}
		else {
			//stack.push(i+""+j+"此路不通,退回");
			return false;
		}
		}
		else {
			//stack.push(i+""+j+"碰到邊緣,退回");
			return false;
		}
	}
	public static void main(String args[]) {
		laby l=new laby();
		l.setWays(l.l, 0, 0);
		while(!l.stack.isEmpty()) {
			System.out.println(l.stack.pop());
		}
	}
}

發佈了18 篇原創文章 · 獲贊 1 · 訪問量 561
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章