#include <stdio.h>
#include <memory.h>
#include <time.h>
#define N 8
int solveNQueens(int n);
void printSolution(int* queens, int n);
void backtrack(int* queens, int n, int row, int* columns, int* diagonals1, int* diagonals2, int* solutionNum);
int main() {
clock_t start = clock();
printf("The are %d solutions to the %d Queens Problem.\n", solveNQueens(N), N);
clock_t stop = clock();
printf("The running time is %.3fs", (double)(stop - start) / CLOCKS_PER_SEC);
return 0;
}
void printSolution(int* queens, int n) {
printf("(");
for (int i = 0; i < n - 1; i++) {
printf("%d, ", queens[i]);
}
printf("%d)\n", queens[n - 1]);
return;
}
void backtrack(int* queens, int n, int row, int* columns, int* diagonals1, int* diagonals2, int* solutionNum) {
if (row == n) {
(*solutionNum)++;
printSolution(queens, n);
} else {
for (int i = 0; i < n; i++) {
int diagonal1 = row - i + n - 1;
int diagonal2 = row + i;
if (columns[i] || diagonals1[diagonal1] || diagonals2[diagonal2]) {
continue;
}
queens[row] = i;
columns[i] = 1;
diagonals1[diagonal1] = 1;
diagonals2[diagonal2] = 1;
backtrack(queens, n, row + 1, columns, diagonals1, diagonals2, solutionNum);
queens[row] = -1;
columns[i] = 0;
diagonals1[diagonal1] = 0;
diagonals2[diagonal2] = 0;
}
}
}
int solveNQueens(int n) {
int solutionNum = 0;
int queens[n];
int columns[n];
int diagonals1[n + n];
int diagonals2[n + n];
memset(queens, -1, sizeof(queens));
memset(columns, 0, sizeof(columns));
memset(diagonals1, 0, sizeof(diagonals1));
memset(diagonals2, 0, sizeof(diagonals2));
backtrack(queens, n, 0, columns, diagonals1, diagonals2, &solutionNum);
return solutionNum;
}
C语言-N皇后问题
于 2022-04-23 21:06:26 首次发布