八皇后問題
唯一要注意的是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;
}
沒有留言:
張貼留言