1. 程式人生 > 其它 >java--演算法--遞迴演算法

java--演算法--遞迴演算法

  1. 遞迴的介紹:
  2. 遞迴演算法的實際應用

      1. package com.model.recursion;
        
        import java.util.Arrays;
        
        /**
         * @Description:測試類
         * @Author: 張紫韓
         * @Crete 2021/7/10 16:15
         * 遞迴演算法實現迷宮問題
         */
        public class RecursionDemo02 {
            public static void main(String[] args) {
        //        製作一個地圖、
                int[][] map = new int[8][7];
        
        // 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; //輸出地圖 for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 7; j++) { System.out.print(map[i][j] + "\t"); } System.out.println(); } findWay(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]
        + "\t"); } System.out.println(); } findWay2(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] + "\t"); } System.out.println(); } } // 使用遞歸回溯,來給小球找路 /** * map[i][j]:出發點 * map[6][5]:終點 * 找最短路徑 * 走過的點數值變為2 * 已經走過了但是走不通的點數值為3 * 還沒有走過的點為0 * 不能走的點位1 */ public static boolean findWay(int[][] map, int i, int j) { if (map[6][5] == 2) { return true; } else { if (map[i][j] == 0) { map[i][j] = 2; if (findWay(map, i + 1, j)) { return true; } else if (findWay(map, i, j + 1)) { return true; } else if (findWay(map, i - 1, j)) { return true; } else if (findWay(map, i, j - 1)) { return true; } else { map[i][j] = 3;//說明當前路為死路 return false; } } else {//如果當前點是 1 ,2,3 說明當前的點位思路返回false return false; } } } public static boolean findWay2(int[][] map,int i,int j){ if (map[6][5]==2){ return true; }else { if (map[i][j]==0){ map[i][j]=2; if(findWay2(map, i+1, j)){ return true; }else if (findWay2(map,i, j+1)){ return true; }else if (findWay2(map, i-1, j)){ return true; }else if(findWay2(map, i, j-1)){ return true; }else { map[i][j]=3; return false; } }else { return false; } } } }
      1. package com.model.recursion;
        
        /**
         * @Description:測試類
         * @Author: 張紫韓
         * @Crete 2021/7/10 17:27
         * 遞迴實現八皇后問題
         */
        public class RecursionDemo03 {
            public static void main(String[] args) {
                RecursionDemo03 recursionDemo03 = new RecursionDemo03();
                recursionDemo03.place(0);
                System.out.println("一共有幾種擺放方式:"+count);
            }
        
            int max=8;
            int[] arr=new int[max]; //儲存結果的陣列
            static int count=0;
            public void print(){
                for (int i = 0; i < arr.length; i++) {
                    System.out.print(arr[i]+"\t");
                }
                System.out.println();
            }
            //檢查是否和前面的棋子同列或同斜線
            public  boolean check(int n){
                for (int i = 0; i < n; i++) {
                    if (arr[i]==arr[n]||Math.abs(n-i)==Math.abs(arr[n]-arr[i])){
                        return false;
                    }
                }
                return true;
            }
        //    放置棋子
            public  void place(int n){
                if (n==max){
                    print();
                    count++;
                    return;
                }
                for (int i = 0; i < max; i++) {
                    arr[n]=i;
                    if (check(n)){
                        place(n+1);
                    }
                }
            }
        }