051J. N-Queens

https://leetcode.com/problems/n-queens/

N-皇后虽然经典,但是我也挺牛的。

以下是一个非常直白的模板写法。很经典。 但是速度不是最快的。 提升办法之一是先建立完整的棋盘,这样放置一个 queen 的时候,就可以排除掉 非常多的位置。避免了重复的运算。这就是一个以空间换效率的 dp。这也是官方 的解法。所以,如果想提升,不如用这个官方的例子来搞定。

class Solution {
    private List<List<String>> collectAns;
    private List<String> tempAns;
    private boolean[] numSet;
    private int N;
    public List<List<String>> solveNQueens(int n) {
        this.collectAns = new ArrayList<>();
        this.tempAns = new ArrayList<>();
        this.numSet = new boolean[9];
        this.N = n;
        backtracker(0);
        return collectAns;
    }
    private void backtracker(int n){
        if(n == N){
            collectAns.add(new ArrayList<String>(tempAns));
            return;
        }
        for(int i = 0; i < N ; i++){
            if(numSet[i]) continue;
            if(!diagChecker(n,i)) continue;
            numSet[i] = true;
            tempAns.add(rowBuilder(i));
            backtracker(n+1);
            tempAns.remove(tempAns.size() - 1);
            numSet[i] = false;
        }
        return;
    }
    private boolean diagChecker(int row, int column){
        for(int r = 1; r < row+1; r++){
            if(  ( (column - r > -1 ) &&  tempAns.get(row - r).charAt(column - r) == 'Q')
                || ( (column + r < N ) && tempAns.get(row - r).charAt(column + r) == 'Q' )  ){
                return false;
            }
        }
        return true;
    }
    private String rowBuilder(int index){
        String row = "";
        for(int i = 0; i < N; i++){
            row += i == index ? "Q" : ".";
        }
        return row;
    }
}

Last updated

Was this helpful?