#include <bits/stdc++.h>
using namespace std;
const int N = 1055;
char result[N][N]; //存放棋盘
int b[N]; //存放棋子的列数
int n;
int ans = 0; //方案数
bool can(int r) //判断能不能放该棋子
{
for (int i = 1; i < r; i++)
{
if (b[i] == b[r] || (abs(i - r) == abs(b[i] - b[r]))) //当列数相等或在同一斜线时返回false
return false;
}
return true;
}
void dfs(int r) //接近深度搜索的方法+剪枝
{
if (r == n + 1) //当走到第n+1行,说明n个棋子都能放下
{
ans++; //方案数加1
for (int i = 1; i <= n; i++)
{
cout << result[i] << endl; //输出棋盘
}
cout << endl;
return; //返回
}
for (int col = 1; col <= n; col++)
{
b[r] = col; //先赋给该棋子所在列
if (can(r)) //去判断该列能不能放棋子
{
result[r][col - 1] = 'Q'; //如果能的话,把该位置变为Q意味着棋子
dfs(r + 1); //开始放下一行的棋子
result[r][col - 1] = '.'; //递归回来时,把棋盘恢复
b[r] = 0; //递归回来时把列重新赋值0,意味着没有放棋子
}
}
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
for (int j = 0; j < n; j++) {
result[i][j] = '.'; //初始化棋盘
}
}
dfs(1); //从第一个棋子开始
cout << ans << '\n' ; //输出方案数
return 0;
}