#include#include #include #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; }



