2013年2月14日 星期四

ACM 750 8 Queens Chess Problem

八皇后問題
唯一要注意的是Solution的編號會到十位數,所以要用%2d來控制輸出格式

#include <stdio.h>
int sol[8], row_used[8], diag1_used[15], diag2_used[15];
int first_row, first_col, count;
void queen(int col)
{
    int i, d1, d2;
    if (col == 8) {
        printf("%2d      ", ++count);
        printf("%d", sol[0]);
        for (i = 1; i < 8; ++i)
            printf(" %d", sol[i]);
        printf("\n");
        return;
    }
    if (col == first_col-1) {
        queen(col+1);
        return;
    }
    for (i = 0; i < 8; ++i) {
        d1 = i + col;
        d2 = (i-col+15) % 15;
        if (!row_used[i] && !diag1_used[d1] && !diag2_used[d2]) {
            row_used[i] = diag1_used[d1] = diag2_used[d2] = 1;
            sol[col] = i+1;
            queen(col+1);
            row_used[i] = diag1_used[d1] = diag2_used[d2] = 0;
        }
    }
}
int main(void)
{
    int n, i, first_data;
    scanf("%d", &n);
    first_data = 1;
    while (n--) {
        if (!first_data)
            printf("\n");
        printf("SOLN       COLUMN\n");
        printf(" #      1 2 3 4 5 6 7 8\n\n");
        scanf("%d%d", &first_row, &first_col);
        for (i = 0; i < 8; ++i)
            row_used[i] = 0;
        for (i = 0; i < 15; ++i)
            diag1_used[i] = diag2_used[i] = 0;
        count = 0;
        row_used[first_row-1] = 1;
        diag1_used[first_row + first_col - 2] = 1;
        diag2_used[(first_row - first_col + 15) % 15] = 1;
        sol[first_col-1] = first_row;
        queen(0);
        first_data = 0;
    }
    return 0;
}

沒有留言:

張貼留言