N 皇后问题是指在 n * n 的棋盘上要摆 n 个皇后,
要求:任何两个皇后不同行不同列不在同一条斜线上,
求给一个整数 n ,返回 n 皇后的摆法数。

数据范围: 1 ≤ n ≤ 9

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;
const int N = 20;
int n;
char map[N][N];
bool col[N], dg[N], udg[N];

void dfs(int x){
    if (x == n + 1){
        for(int i = 1; i <= n;i++){
            for (int j = 1; j <= n; j ++ )
                printf("%c", map[i][j]);
            puts("");
        }
        puts("");
    }
    
    for(int i = 1; i <= n;i++){
        if (!col[i] && !dg[n - x + i] && !udg[x + i]){
            col[i] = dg[n - x + i] = udg[x + i] = true;
            map[x][i] = 'Q';
            dfs(x + 1);
            col[i] = dg[n - x + i] = udg[x + i] = false;
            map[x][i] = '.';
        }
    }
    
}

int main(){
    scanf("%d", &n);
    for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= n; j ++ )
            map[i][j] = '.';
            
            
    dfs(1);
    return 0;
}