容易看懂的解法:要把所有的皇后都摆满,就要从上到下一个个把皇后填入棋盘。那么我们直接开辟一个boolean[][] board数组来模拟皇后所存放的位置,每一个格子都尝试放置皇后即可。在放皇后之后,需要注意的是,皇后所在的行,列,撇,捺4个方向都不能放置新的皇后。那么看起来就要使用某个机制来记住这四个方向。可以考虑把棋盘当成朝下的直角坐标系(x,y),撇方向由一次函数y=-x+b决定,那么在某个点已经放置了皇后的情况下,移项就有y+x=b,则撇方向直接可以由y+x确定。同理,捺方向可以由y=x+c决定,因此撇捺两个方向可以由两个整数,y+x,y-x记录。用set存放即可。此外,由于每一行放置了皇后就直接跳入下一层,因此可以不用记录行。每一层遍历之后,需要清除摆放皇后的限制(清除4个方向)。



public class Solution {
    /**
     * 
     * @param n int整型 the n
     * @return int整型
     */
    int n;
    int count;
    Set<Integer> col = new HashSet<>();
    Set<Integer> mainDiagonal = new HashSet<>();
    Set<Integer> subDiagonal = new HashSet<>();
    public int Nqueen (int n) {
        // write code here
        this.n = n;
        boolean board[][] = new boolean[n][n];
        func(0,board);
        return count;
    }
    public void func(int index,boolean[][]board){
        if(index==n){
            count++;
            return;
        }
        for(int i=0;i<n;++i){
            if(col.contains(i)||mainDiagonal.contains(index+i)||subDiagonal.contains(index-i))continue;
            col.add(i);
            mainDiagonal.add(index+i);
            subDiagonal.add(index-i);
            board[index][i] = true;
            func(index+1,board);
            board[index][i] = false;
            col.remove(i);
            mainDiagonal.remove(index+i);
            subDiagonal.remove(index-i);
        }
    }
}