[ Back to the overview Matrix ]

Test case : 8 Queens Problem using ANSI/ISO C

Lines used: 33
#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");
    }
}


Contributed by Paul Hsieh, qed at pobox.com