ZBLOG

在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。用递归算法解决该问题。 编程要求 请在右侧编辑器Begin-End处补充代码,完成本关任务。 测试说明 平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试: 测试输入:4(皇后的数目) 预期输出: * Q * * * * * Q Q * * * * * Q * * * ...

下面是一个递归解决 n 皇后问题的示例代码:

#include <stdio.h>
#include <stdbool.h>

void printSolution(int board[], int n) {
    // 打印棋盘上的皇后位置
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (board[i] == j) {
                printf("Q ");
            } else {
                printf("* ");
            }
        }
        printf("\n");
    }
}

bool isSafe(int board[], int row, int col) {
    // 检查当前位置是否安全(不与已放置的皇后冲突)
    for (int i = 0; i < row; i++) {
        if (board[i] == col || board[i] - i == col - row || board[i] + i == col + row) {
            return false;
        }
    }
    return true;
}

void solveNQueensHelper(int board[], int row, int n, int* solutions) {
    if (row >= n) {   // 找到了一种解决方案
        (*solutions)++;
        printSolution(board, n);
        printf("\n");
        return;
    }

    for (int col = 0; col < n; col++) {   // 在当前行中尝试每一列的位置
        if (isSafe(board, row, col)) {   // 检查当前位置是否安全
            board[row] = col;

            solveNQueensHelper(board, row+1, n, solutions);   // 进入下一行

            // 回溯到上一行
            board[row] = -1;
        }
    }
}

void solveNQueens(int n) {
    int solutions = 0;

    int* board = malloc(n * sizeof(int));
    for (int i = 0; i < n; i++) {
        board[i] = -1;   // 初始化棋盘,-1 表示没有放置皇后
    }

    solveNQueensHelper(board, 0, n, &solutions);

    printf("%d皇后问题共有%d种摆放方案\n", n, solutions);

    free(board);
}

int main() {
    int n;
    scanf("%d", &n);
    
    solveNQueens(n);
    
    return 0;
}

请将以上代码复制到编辑器的 Begin-End 部分,并输入要测试的皇后数目,运行代码即可得到相应的解决方案。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=12210

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?