八皇后问题(递归)

八皇后问题-递归
思路:

  1. 解法存储思路: 一维数组,arr[8], 下标表示第 n 个(行)皇后, value 表示第 n 个皇后所在的列
  2. 判断第 n 个皇后与前面摆放的 n - 1 个皇后是否冲突
    2.1 因为一维数组,下标++,不会发生行冲突
    2.2 判断列冲突 arr[n] == arr[i]
    2.3 判断斜线: 利用斜率 : (y1-y2) / (x1 - x2) = 1
  3. 摆放棋子:
    3.1 结束条件:判断是否摆完
    3.2 循环 i = 0 至 8 , 遍历每一行的列
    3.3 若不冲突,递归调用自己进行下一行(个) 的 摆放 ----- check(n+1)

public class Queen8 {
    
    

    int max = 8;
    // 存储八皇后解法
    // 下标为八皇后的行, value 为八皇后的列
    int[] arr = new int[max];

    static int count = 0; // 记录有多少种解法

    public static void main(String[] args) {
    
    
        Queen8 q = new Queen8();
        q.check(0);
        System.out.println("共有 " + count + " 种");
    }

    /**
     *  摆放第 n 个皇后
     */
    public void check(int n){
    
    
        if(n == max){
    
    
            // 表示得到了一种解法了
            print();
            return ;  // 打印完后回溯上一个栈
        }
        for (int i = 0 ; i < max ; i++){
    
    
            arr[n] = i;
            // 第 n 个皇后 (行) 第 i 列
            if(judege(n)){
    
    
                // 判断该第 n 个皇后的 第 i 列是否与前面的摆放有冲突。
                // true 无冲突
                check(n+1);
            }
        }

    }

    /**
     * 判断当前第 n 个皇后的摆放与前n个是否有冲突。
     *
     * @return
     */
    public boolean judege(int n) {
    
    
        // 遍历前面的 n-1 个查看是否有冲突
        for (int i = 0; i < n; i++) {
    
    
            // arr[i] == arr[n]  判断是否在同一列
            // Math.abs(n - i) == Math.abs(arr[n] - arr[i])  判断是否在同一个斜线
            // 可以理解成 (y1 - y2)/(x1-x2) = 1  斜率
            if (arr[i] == arr[n] || Math.abs(n - i) == Math.abs(arr[n] - arr[i])) {
    
    
                return false;
            }
        }
        return true;
    }

    /**
     *  打印数组内容
     */
    public void print(){
    
    
        count++;
        for (int i = 0 ; i < max ; i++){
    
    
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }

}


猜你喜欢

转载自blog.csdn.net/qq_43765535/article/details/107525853