回溯的思路
回溯法的根本思想就是每次都寫出全部的解決方法,然後通過下一步的正確與否來決定每個解決方法是否有效,下一步又把全部解決方法寫出來,每個解決方法又根據下下步能否有效來決定,最終直到找到最後一步,再開始回溯,注意最終執行順序是由最後一步開始倒着執行。
本題的思路
每一步都有四個方向,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());
}
}
}