迷宮問題:
如圖,迷宮大小爲8行7列。紅色區爲牆,藍色小球只能在白色區域走動 。
具體說明:
1、map 表示迷宮;
2、i、j 表示從迷宮的哪個位置開始出發(假設從1,1出發);
3、如果小球能到 map[6] [5] 的位置,說明小球已找到通路。
4、設置:
當 map[i] [j] =0 :表示該點沒有走過;
當 map[i] [j] =1 :表示牆和擋板;
當 map[i] [j] =2 :表示該點可以走;
當 map[i] [j] =3:表示該點可以走,但走不通;
5、小球走迷宮時,需要確定走的方向,假設爲 下 → 右 → 上 → 左,如果該點走不通,再回溯。
實現代碼如下:
package com.ycx.recursion;
public class MiGong {
public static void main(String[] args) {
//先創建一個二維數組:模擬迷宮
int[][] map = new int[8][7];
//使用數字1表示牆
for (int i = 0; i <7 ; i++) {
//第一行和第八行全部置爲1
map[0][i]=1;
map[7][i]=1;
}
for (int i = 0; i <8 ; i++) {
//第一列和第七列全部置爲1
map[i][0]=1;
map[i][6]=1;
}
//設置擋板 也用1表示
map[3][1]=1;
map[3][2]=1;
//輸出
System.out.println();
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); //從(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();
}
/*
1、map 表示迷宮;
2、i、j 表示從迷宮的哪個位置開始出發(假設從1,1出發);
3、如果小球能到 map[6] [5] 的位置,說明小球已找到通路。
4、設置:
當 map[i] [j] =0 :表示該點沒有走過;
當 map[i] [j] =1 :表示牆和擋板;
當 map[i] [j] =2 :表示該點可以走;
當 map[i] [j] =3:表示該點可以走,但走不通;
5、小球走迷宮時,需要確定走的方向,假設爲 下 → 右 → 上 → 左,如果該點走不通,再回溯。
*/
}
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 { //這個點走不通
map[i][j]=3;
return false;
}
}else{ //map[i][j]!=0 ,那麼可能爲1,2,3
return false;
}
}
}
}
運行結果如下: