一. 题目

二. 思路

  • dfs, 行col,dg,udg。

  • //对角 y=x+b b=y-x+n

    //反对角 y=-x+b, b=y+x

  • y是u, x是i。

三. 代码

import java.util.*;
import java.io.*;

public class Main
{
    static final int N = 20;
    static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    static String[] rs;

    int n;
    char[][] g = new char[N / 2][N / 2];
    boolean[] col = new boolean[N], dg = new boolean[N], udg = new boolean[N];

    public static void main(String[] args) throws Exception
    {
        Main main = new Main();
        main.work();
    }

    void dfs(int u) throws Exception
    {
        if (u == n)//到达第n行
        {
            for (int i = 0; i < n; ++i)
            {
                StringBuilder sb = new StringBuilder();
                for (int j = 0; j < n; ++j)
                    sb.append(g[i][j]);
                sb.append('\n');
                bw.write(sb.toString());
            }
            bw.newLine();
            return;
        }

        for (int i = 0; i < n; ++i)
            if (!col[i] && !dg[u - i + n] && !udg[u + i])
            {
                g[u][i] = 'Q';
                col[i] = dg[u - i + n] = udg[u + i] = true;
                dfs(u + 1);
                g[u][i] = '.';
                col[i] = dg[u - i + n] = udg[u + i] = false;
            }
    }

    void work() throws Exception
    {
        rs = br.readLine().split(" ");
        n = Integer.parseInt(rs[0]);
        for (int i = 0; i < n; ++i)
            Arrays.fill(g[i], '.');
        dfs(0);
        bw.close();
    }
}