import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Scanner;
public class Main {
static int n,N = 20; //这里只会用到2 * n - 1的格子,开大点保险
static char[][] g = new char[N][N];
static boolean[] col = new boolean[N]; //col[i]表示当前行的第i列是否被用过,
static boolean[] dg = new boolean[N]; //dg[i]表示第i个主对角线是否用过,主对角线是[0][0]~[N][N]方向
static boolean[] udg = new boolean[N]; //表示同上,反对角线是[0][N]~[N][0]那条对角线
static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String[] args)throws IOException {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
g[i][j] = '.';
}
}
dfs(0);
out.flush();
}
public static void dfs(int u)throws IOException {
//只有n个数都放进去了才会打印,如果只放了n - 1个数就回溯的话,这个方案就表示行不通
if (u == n){
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
out.write(g[i][j] + "");
}
out.newLine();
}
out.newLine();
return;
}
//每次再往前走的时候,发现这个点不能用就不管这个点,去判断下一个点
for (int i = 0; i < n; i++) {
//g[u][i]没被用过,且该点的主反对角线也没被用过
if (!col[i] && !dg[u - i + n] && !udg[i + u]){
/*
所有下标都从0开始
主对角线上的的表达式为u = i + b,其中行-列的值为定值
每一个b对应一条副对角线 b ∈[-(N - 1),N - 1],一共 2 * N - 1个取值
这里的u - i 或者 i - u都没事,不影响
副对角线的表达式为 u = -i + b,其中行 + 列为定值
每一个b对应一条副对角线 b ∈[0,2 * (N - 1)],一共 2 * N - 1个取值
*/
//没用过的点把皇后放进去
g[u][i] = 'Q';
//把该点的主副对角线标记为用过
col[i] = dg[u - i + n] = udg[i + u] = true;
//找下一行的放皇后的位置
dfs(u + 1);
//一条路走完往回归的时候记得要把走过的路恢复,不然下次走会有误
col[i] = dg[u - i + n] = udg[i + u] = false;
g[u][i] = '.';
}
}
}
}