遞歸--解決迷宮問題


1、遞歸概念

  • 自己調用自己
  • 每次調用傳入的變量都不同

2、遞歸怎么調用的

 

 

 3、遞歸應該遵守的規則

  • 執行一個方法時,就創建一個新的受保護的獨立空間(棧空間)
  • 方法的局部變量是獨立的,不會相互影響,比如n變量
  • 遞歸必須有退出的條件,否則就是無限遞歸,報stackOverFloweError(棧溢出錯誤)
  • 當一個萬法執行完畢,或者遇到returm,就會返回,守誰調用,就將結果返回給誰
  • 如果萬法中使用的是引用類型變量(比如數組),就會共享該引用類型的數據

4、迷宮問題解決

  

 

  

 先用二維數組模擬出表格,給部分表格賦值1來說明是牆壁(紅色部分)

 

public static void main(String[] args) {
        int[][] map=new int[10][10];
        //設置牆體
        for (int i=0;i<10;i++){
            map[0][i]=1;
            map[i][0]=1;
            map[i][9]=1;
            map[9][i]=1;
        }
        //設置障礙
        map[3][1]=1;
        map[3][2]=1;
        //map[1][2]=1;
        //map[2][2]=1;

        //打印表格
        for (int i=0;i<10;i++){
            for (int j=0;j<10;j++){
                System.out.print(map[i][j]+"  ");
            }
            System.out.println();
        }

        //進行尋路
        setWay(map,1,1);

        //打印表格
        System.out.println("尋路完成");
        for (int i=0;i<10;i++){
            for (int j=0;j<10;j++){
                System.out.print(map[i][j]+"  ");
            }
            System.out.println();
        }
}

 

設置尋路的方法,按照設置的策略(如下右上左)來逐個進行遞歸,如果能走通,這條路線標識為2,走不通(無法到達指定終點)遞歸進行回溯,將走過的路置為3

判斷這條路是否可行: 1是牆,2是走過的路,3是走不通的路

 //設置策略方法(下右上左)
    public static boolean setWay(int[][] map,int i,int j){ //map表示數組地圖,i,j表示坐標
        if (map[8][8]==2){//開始前判斷該節點是否找到
            return true;
        }else{
            if (map[i][j]==0){
                map[i][j]=2; //走過的地方都先置為2,回溯后置為3
                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; //查找失敗時,這個路線回溯並設置為3
                    return false;
                }
            }else{
                return false;
            }
        }

運行結果是:

 

 

 注意:選擇的策略不同,迷宮的查找路徑就不同 

 

如何獲取最短路徑?

可以統計不同的策略生成的路線,通過獲取策略的路徑長度來比較出最短路徑的策略

如上面這種策略,統計路徑長度

 //統計路長
        int count=0;//長度
        for (int i=0;i<10;i++){
            for (int j=0;j<10;j++){
                if (map[i][j]==2){ //當路徑標識為2時為可用
                    count+=1;
                }
            }
        }

        System.out.println("路徑長"+count);

 

    

    


免責聲明!

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



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