import java.util.*;
public class Solution {
   
    List<List<String>> ans = new ArrayList<>();
    int[] row;
    boolean[] cols, d, ud;
    int N;
    public int Nqueen(int n) {
        N = n;
        cols = new boolean[n];
        d = new boolean[25];
        ud = new boolean[25];
        row = new int[n]; // 用来保存第几行第几列放置Q
        dfs(0);
        return ans.size();
    }
    void dfs(int i) { 
        if (i == N) {//行数为n
            char[] arr = new char[N];
            Arrays.fill(arr, '.');
            List<String> tmp = new ArrayList<>();
            for (int j = 0; j < N; j++) {
                arr[row[j]] = 'Q';
                tmp.add(new String(arr)); 
                arr[row[j]] = '.';
            }
            ans.add(tmp);
            return;
        }
        //选择一个位置进行放置
        for (int j = 0; j < N; j++) {
            if (!cols[j] && !d[i + j] && !ud[N - i + j]) {
                //列,对角线、反对角线判断
                cols[j] = d[i + j] = ud[N - i + j]= true;
                row[i] = j;
                dfs(i + 1);
                cols[j] = d[i + j] = ud[N - i + j]= false;
            }
        }
    }
}