编辑代码

#include <stdio.h>

// 定义棋盘大小
#define N 8

// 打印棋盘函数
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");
    }
    printf("\n");
}

// 检查一个位置是否可以放置皇后
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 solveNQueens(int board[N][N], int col) {
    // 所有皇后都已放置完毕
    if (col == N) {
        printSolution(board);
        return 1;
    }

    // 尝试在当前列中的每一行放置皇后
    int res = 0;
    for (int i = 0; i < N; ++i) {
        if (isSafe(board, i, col)) {
            board[i][col] = 1;

            // 递归求解下一列
            res += solveNQueens(board, col + 1);

            // 回溯,撤销当前位置的皇后
            board[i][col] = 0;
        }
    }

    return res;
}

// 主函数
int main() {
    // 创建一个空棋盘
    int board[N][N] = { {0} };

    // 求解八皇后问题
    int solutions = solveNQueens(board, 0);
    printf("总共有 %d 种解法\n", solutions);

    return 0;
}