#include <stdio.h>
unsigned char queens[8];
int row (unsigned long vert, unsigned long diag, int r) {
unsigned long m0;
unsigned long m1;
/* Set diagonal initial bits. */
m1 = (0x10000 << r) | (1 << (7 ^ r));
for (m0 = 1; m0 < (1 << 8); m0 += m0, m1 += m1) {
/* See if lines not already attacked */
if ( 0 == ((vert & m0) | (diag & m1)) ) {
/* Recurse on next row after attacking these lines */
if (r == 7 || 0 < row (vert | m0, diag | m1, r+1)) {
queens[r] = m0;
return 1;
}
}
}
return 0;
}
void dispSolution () {
int i, j;
for (i=0; i < 8; i++) {
for (j=0; j < 8; j++) printf (" %c", ".Q"[queens[i]==(1 << j)]);
printf ("\n");
}
}
void main () {
if (row (0, 0, 0)) {
dispSolution ();
} else {
printf ("No solution\n");
}
}