演算法:N皇后二

於對對 發表於 2020-10-17

題目:
leetcode 52題。
在 n×n 的國際象棋棋盤上,放置n個皇后。有幾種方法,可以使得n個皇后不能互相攻擊。
在這裡插入圖片描述在國際象棋中,皇后可以如圖的4個方向。

解法:
回溯法。
遍歷n,
定義一個行的陣列 columns,用於儲存已有皇后的行
定義一個左斜線的陣列 left_line,用於儲存已有皇后的左斜線
定義一個右斜線的陣列 right_line,用於儲存已有皇后的右斜線

對於一列中的每一個數值i,判斷i的行,左斜線,右斜線是否已存在上述3個陣列中。
如果存在,則繼續。
否則,將其存入對應的陣列。
直到遍歷完所有的列。
此時,返回1.
遞迴判斷所有的行。

程式碼

class Solution {
    Set<Integer> columns = new HashSet<Integer>();   // 列
    Set<Integer> left_line = new HashSet<Integer>(); // 左斜線
    Set<Integer> right_line = new HashSet<Integer>();// 右斜線
    public int totalNQueens(int n) {
        int res = backtrack(n,0);
        return res;
    }

    public int backtrack(int n,int row) {
        if (row==n) {
            return 1;
        } else {
            int count=0;
            for (int i = 0; i < n; i++) {
                if (columns.contains(i))
                    continue;
                if (left_line.contains(row - i))
                    continue;
                if (right_line.contains(row + i))
                    continue;
                columns.add(i);
                left_line.add(row - i);
                right_line.add(row + i);
                count += backtrack(n, row + 1);
                columns.remove(i);
                left_line.remove(row - i);
                right_line.remove(row + i);
            }
            return count;
        }
    }
}