ZBLOG

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

以下是使用递归算法解决n皇后问题的示例代码:

#include <stdio.h>
#define MAX_N 10

int count = 0;

void printBoard(int board[MAX_N][MAX_N], int n) {
    printf("第%d种方案:\n", ++count);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (board[i][j] == 1) {
                printf("Q ");
            } else {
                printf("* ");
            }
        }
        printf("\n");
    }
    printf("\n");
}

int isSafe(int board[MAX_N][MAX_N], int row, int col, int n) {
    // 检查当前位置上方的所有行是否有皇后
    for (int i = 0; i < row; i++) {
        if (board[i][col] == 1) {
            return 0;
        }
    }
    
    // 检查左上对角线是否有皇后
    for (int i = row, j = col; i >= 0 && j >= 0; i--, j--) {
        if (board[i][j] == 1) {
            return 0;
        }
    }
    
    // 检查右上对角线是否有皇后
    for (int i = row, j = col; i >= 0 && j < n; i--, j++) {
        if (board[i][j] == 1) {
            return 0;
        }
    }
    
    return 1;
}

void solveNQueens(int board[MAX_N][MAX_N], int row, int n) {
    if (row == n) {
        printBoard(board, n);
        return;
    }
    
    for (int col = 0; col < n; col++) {
        if (isSafe(board, row, col, n)) {
            board[row][col] = 1;
            solveNQueens(board, row + 1, n);
            board[row][col] = 0;
        }
    }
}

int main() {
    int n;
    printf("请输入n:");
    scanf("%d", &n);

    int board[MAX_N][MAX_N] = {0};

    solveNQueens(board, 0, n);

    printf("共有%d种摆放方案\n", count);
    
    return 0;
}

在上述代码中,我们使用回溯法和递归来解决n皇后问题。其中solveNQueens函数用于逐行尝试放置皇后,并在每一行都找到合适的列进行放置。isSafe函数用于检查当前位置是否安全,即不会与已放置的皇后冲突。最后,printBoard函数用于打印出一种正确的摆放方案。

你可以将以上代码复制到编译器中运行,并输入不同的测试样例进行验证。

对于测试样例4,预期输出为两种摆放方案,并按照国际象棋的规则打印出了棋盘上皇后的位置。


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?