编辑代码

#include <stdio.h>

#define N 8

int board[N][N];

// 检查当前位置是否可以放置皇后
int isSafe(int row, int col)
{
    int i, j;

    // 检查当前列是否有其他皇后
    for (i = 0; i < row; i++)
    {
        if (board[i][col])
            return 0;
    }

    // 检查左上对角线是否有皇后
    for (i = row, j = col; i >= 0 && j >= 0; i--, j--)
    {
        if (board[i][j])
            return 0;
    }

    // 检查右上对角线是否有皇后
    for (i = row, j = col; i >= 0 && j < N; i--, j++)
    {
        if (board[i][j])
            return 0;
    }

    return 1;
}

// 递归函数来放置皇后
int solveNQueensUtil(int row)
{
    // 所有皇后都已经放置完毕,则打印解
    if (row == N)
    {
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < N; j++)
            {
                printf("%d ", board[i][j]);
            }
            printf("\n");
        }
        printf("\n");
        return 1;
    }

    int res = 0;

    // 尝试在当前行的每一列放置皇后
    for (int col = 0; col < N; col++)
    {
        // 如果当前位置可以放置皇后,则继续尝试下一行
        if (isSafe(row, col))
        {
            // 放置皇后
            board[row][col] = 1;

            // 递归放置下一行的皇后
            res += solveNQueensUtil(row + 1);

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

    return res;
}

// 打印八皇后问题的解
void solveNQueens()
{
    int res = solveNQueensUtil(0);
    printf("共有 %d 解\n", res);
}

int main()
{
    solveNQueens();
    return 0;
}