劍指Offer28:字符排列組合問題高級版

n皇后問題

問題描述

N皇后問題,在一個NN的棋盤上放置N個皇后,使其不能互相攻擊(同一行、同一列、同一斜線上的皇后都會自動攻擊),即任意兩個皇后不得處於同一行、同一列、同意斜線上。

問題分析

我們可以定義一個數組Column[N]來存放每一行皇后的列號,數組中第i個數字就表示位於第i行的皇后的列號;並將0、1、2、3、4…N-1分別放入數組中放入時候判斷是否在同一列,以及是否爲一條斜線。

public class Code028_03 {
    public static void main(String[] args) {
        //鍵盤接收一個參數輸入,表示N
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        int result = totalNQueens(N);
        System.out.println(result);
    }
    //定義一個靜態變量,用來記錄(存儲)滿足情況的排列數
    static int sum = 0;
    private static int totalNQueens(int n) {
        if (n <= 0) {
            return 0;
        }
        int[] data = new int[n];
        sum = QueenCore(0, n, data, sum);
        return sum;
    }

    private static int QueenCore(int index, int n, int[] data, int sum) {
        if (index >= n) {
            sum+=1;
//            System.out.println(sum);
            for (int i = 0; i < n; i++) {
                System.out.print(data[i] + ", ");
            }
            System.out.println();
        } else {
            for (int i = 0; i < n; i++) {
                data[index] = i;
                if (Diagonal(data, index)) {
                    sum=QueenCore(index + 1, n, data, sum);
                }
            }
        }
        return sum;
    }

    private static boolean Diagonal(int[] data, int index) {
        for (int i = 0; i < index; i++) {
            //判斷任意兩個皇后是否在同一斜線,是否在同一列;滿足在同一斜線:兩元素的列之差的絕對值等於行之差的絕對值
            if (Math.abs(data[i] - data[index]) == Math.abs(i - index) || data[i] == data[index]) {
                return false;
            }
        }
        return true;
    }
}

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