Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

8 Queens Problem

The goal of 8 Queens Problem is to put eight queens on a chess-board such that none of them threatens any of others. A queen threatens the squares in the same row, in the same column, or on the same diagonals as shown in the following figure.

For a given chess board where $k$ queens are already placed, find the solution of the 8 queens problem.

Input

In the first line, an integer $k$ is given. In the following $k$ lines, each square where a queen is already placed is given by two integers $r$ and $c$. $r$ and $c$ respectively denotes the row number and the column number. The row/column numbers start with 0.

Output

Print a $8 \times 8$ chess board by strings where a square with a queen is represented by 'Q' and an empty square is represented by '.'.

Constraints

There is exactly one solution

Sample Input 1

2
2 2
5 3

Sample Output 1

......Q.
Q.......
..Q.....
.......Q
.....Q..
...Q....
.Q......
....Q...

Solution in JavaScript (judge verdict: Accepted)

var N = 8
var row = Array.from(Array(N), () => -1);
var col = new Array(N);
var dpos = new Array(2 * N - 1);
var dneg = new Array(2 * N - 1);

function search(r) {
  if (r === N) {
    printBoard();
    return true;
  }

  if (row[r] !== -1) return search(r + 1);
  for (let c = 0; c < N; c++) {
    if (col[c] || dpos[r + c] || dneg[r - c + N - 1]) continue;
    changeBoard(r, c, true);
    search(r + 1);
    changeBoard(r, c, false);
  }
  return false;
}

function changeBoard(r, c, flg) {
  if (flg) {
      row[r] = c;
  } else {
      row[r] = -1;
  }
  col[c] = dpos[r + c] = dneg[r - c + N - 1] = flg;
}

function printBoard() {
  for (let r = 0; r < N; r++) {
     for (let c = 0; c < N; c++) {
       process.stdout.write(row[r] === c ? 'Q' : '.');
     }
     console.log();
  }
}

(function main() {
  const lines = require('fs').readFileSync('/dev/stdin', 'utf8').trim().split('\n');
  const k = Number(lines.shift());

  let r, c;
  for (let i = 0; i < k; i++) {
    [r, c] = lines.shift().split(' ').map(Number);
    changeBoard(r, c, true);
  }
  search(0);
})();