Java實現迷宮和八皇后

該文章主要是介紹兩個遞歸的demo(迷宮問題和八皇后)git

迷宮問題github

/**
 * @desc 迷宮問題
 * 1.初始化一個8行7列的矩陣 map[8][7]
 * 2.假設:
 * (1)三種類型:0-尚未走,1-檔板,2-能夠走(已走),3-走不通
 * (2)策略:下-》右-》下-》左
 * (3)初始值:周圍都是1
 * 3.過程分析:
 * (1)已經找到(肯定找到的條件:第7行6列即爲找到 =》 [6,5]=2)
 * (2)尚未找到按策略去找
 *
 * @Author xw
 * @Date 2019/9/3
 */
public class MingGong {
    public static void main(String[] args) {
        // 1.初始化一個8行7列的矩陣arr[8][7]
        int[][] map = new int[8][7];
        // 2.初始值:周圍都是1
        // 第1行和第8行設置檔板
        for (int j = 0; j < 7; j++) {
            map[0][j] = 1;
            map[7][j] = 1;
        }
        // 第1列和第7列設置檔板
        for (int i = 0; i < 8; i++) {
            map[i][0] = 1;
            map[i][6] = 1;
        }
        // 輸出矩陣
        print(map);
        System.out.println("-------------------------");
        // 設置檔板 [3,1]=1,[3,2]=1
        map[3][1] = 1;
        map[3][2] = 1;
        print(map);
        // 策略:下-》右-》上-》左
        setWay(map, 1, 1); // 從[1,1]這個位置開始
        System.out.println("策略:下-》右-》上-》左 =>");
        print(map);
    }
}

八皇后算法

/**
 * @desc 8皇后問題
 * 1.是什麼?
 *  8x8的矩陣,任意兩個位置不能處於同一行、同一列或同一斜線,能找出多少種解法,這就是8皇后問題
 * 2.思路分析
 * (1)第一個皇后放第一行第一列[0,0]
 * (2)第二個皇后放第二行第一列[1,0]...直到判斷ok,
 *      若是不ok,繼續放在第二列、第三列、依次把全部列放完,找到一個合適位置
 * (3)繼續第三個皇后,仍是第一列、第二列...直到第8個皇后也放在一個不衝突的位置,
 *      算是找到一個正確解
 * (4)當獲得一個正確解時,在棧回退到上一個棧時,就會開始回溯,即將第一個皇后,放在第一列的全部正確解,所有獲得
 * (5)而後回頭繼續第一個皇后放第二列,後面繼續循環執行1-4步驟
 * 3.說明
 *  理論上建立一個二維數組來表示一個棋盤,但實際上能夠經過算法,
 *  用一個一維數組便可解決 arr[8] = {0, 4, 7, 5, 2, 6, 1, 3}
 *  // arr[0] = 0 表示第1個皇后(第一行)放在第1列,即[0,0]
 *  // arr[1] = 4 表示第2個皇后(第二行)放在第5列,即[1,4]
  * 下標表示第幾行 即第幾個皇后
 *  arr[i] = val,val表示第i+1個皇后放在第i+1行的第val+1列
 * @Author xw
 * @Date 2019/9/4
 */
public class Queen8 {
    private int max;
    private int[] arr;
    private int count;
    public Queen8(int max) {
        this.max = max;
        this.arr = new int[max];
    }
    public static void main(String[] args) {
        for (int i = 0; i < 8; i++) {
            System.out.print(String.format("R%s\t", i+1));
        }
        System.out.println();
        Queen8 queen8 = new Queen8(8);
        queen8.check(0);
        System.out.println(String.format("共有%s種解法", queen8.count));
    }
}

 

gitee地址:https://gitee.com/linestyle007/jucdemo2數組

博客地址:https://linestyle007.gitee.io/this

github地址:https://github.com/line007/jucdemo2spa

相關文章
相關標籤/搜索