遞歸之迷宮回溯問題(分析與實現)

迷宮問題:

如圖,迷宮大小爲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;
                }
            }

    }
}

運行結果如下:
在這裏插入圖片描述

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