數據結構之利用遞歸算法解決迷宮問題


迷宮問題:就是將一個小球放置在一個位置,通過一定的策略找到出口,在本篇中制定的策略只是其中一種,如果有興趣,可以修改策略,來玩一玩,其實也會牽扯到另一個問題就是可以制定不同的策略,所有的距離長度是不一樣的,可以將這些策略做一個統計,獲取迷宮問題的最短路徑

,下面就直接代碼了

迷宮的樣式可以自己設定

package com.gcy.recursion;
/**
* 使用遞歸解決迷宮問題
* @author Administrator
*
*/
public class MiGong {

public static void main(String[] args) {
//創建二維數組,模擬迷宮
int [][] map=new int[8][7];
//使用1的位置表示牆,左右上下設置為1,表示牆
//上下
for(int i=0;i<7;i++) {
map[0][i]=1;
map[7][i]=1;
}
//左右
for(int i=0;i<8;i++) {
map[i][0]=1;
map[i][6]=1;
}
//進去的兩個,設置擋板
map[3][1]=1;
map[3][2]=1;

//遍歷map
//地圖情況
System.out.println("地圖情況");
for(int i=0;i<8;i++) {
for(int j=0;j<7;j++) {
System.out.print(map[i][j]+" ");
}
System.out.println(" ");
}
//使用遞歸回溯給小球找路
setWay(map, 1, 1);
//輸出新的地圖,表示小球走過並標識過的
System.out.println("小球走過的地圖情況");
for(int i=0;i<8;i++) {
for(int j=0;j<7;j++) {
System.out.print(map[i][j]+" ");
}
System.out.println(" ");
}
}
/**
* 使用遞歸方式給小球找路
* 說明:
* 開始位置map[1][1],到達位置map[6][5]
* 當map[i][j]=0時,表示該點小球還沒有走過,當為1的時候表示牆,當為2的時候表示可以走,當為3時,表示該位置已經走過,但是走不通
* 制定策略,在走迷宮時,依次是下——>右——>上——>左,如果走不通在回溯
*
* @param map 地圖
* @param i 從哪個位置開始找(行)
* @param j 從哪個位置開始找(列)
* @return 如果找到返回true
*/
public static Boolean setWay(int [][] map,int i,int j) {
if(map[6][5]==2) {//通路已經找到
return true;
}else{
if((map[i][j]==0) ) {//表示這個點還沒有走過
//按照制定的策略開始執行
map[i][j]=2;//假設該點可以走通
if(setWay(map, i+1, j)) {//向下走
return true;
}else if(setWay(map, i, j+1)) {//向右走
return true;
}else if(setWay(map, i-1, j)) {//向上走
return true;
}else if(setWay(map, i, j-1)){//向左走
return true;
}else {//如果上面條件都不滿足,則證明這個點是個死路,要設置為3
map[i][j]=3;
return false;
}
}else {//如果map[j][j]!=0,則有可能為1,2,3
return false;

}


}

}

}

以上就是通過下——>右——>上——>左策略來解決迷宮問題的

執行的結果圖,數字2代表的就是小球出迷宮的一種路線

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM