// 打印棋盘
void printSolution(int board[N][N]) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++)
printf(" %d ", board[i][j]);
printf("\n");
}
}
// 检查在 board[row][col] 放置皇后是否安全
int isSafe(int board[N][N], int row, int col) {
int i, j;
// 检查该行是否有其他皇后
for (i = 0; i < col; i++)
if (board[row][i])
return 0;
// 检查左上方是否有其他皇后
for (i = row, j = col; i >= 0 && j >= 0; i--, j--)
if (board[i][j])
return 0;
// 检查左下方是否有其他皇后
for (i = row, j = col; j >= 0 && i < N; i++, j--)
if (board[i][j])
return 0;
return 1;
}
// 回溯函数求解八皇后问题
int solveNQUtil(int board[N][N], int col) {
if (col >= N)
return 1;
for (int i = 0; i < N; i++) {
if (isSafe(board, i, col)) {
board[i][col] = 1;
if (solveNQUtil(board, col + 1))
return 1;
board[i][col] = 0; // 回溯,尝试下一个位置
}
}
return 0;
}
// 解决八皇后问题
void solveNQ() {
int board[N][N] = { {0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0} };
if (solveNQUtil(board, 0) == 0) {
printf("No solution exists");
return;
}
printSolution(board);
}
int main() {
solveNQ();
return 0;
}