ZBLOG

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

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

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

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 solveNQueens(int n) {
    int solutions = 0;
    
    int* stack = malloc(n * sizeof(int));  // 使用栈来保存回溯过程中的状态
    
    int row = 0, col = 0;
    
    // 初始化第一行皇后位置为(0,0),将其入栈
    stack[0] = 0;
    
    while (row >= 0) {
        while (col < n) {
            if (isSafe(stack, row, col)) {   // 检查当前位置是否安全
                stack[row] = col;   // 将当前位置入栈
                
                if (row == n-1) {   // 如果已经放置了最后一行的皇后,表示找到一个解决方案
                    solutions++;
                    break;
                }
                
                row++;   // 进入下一行,从第0列开始搜索
                col = 0;
                
            } else {
                col++;   // 如果当前位置不安全,尝试下一个位置
            }
        }

        if (col == n || row == -1) {
            // 回溯到上一行
            row--;
            if (row >= 0) {
                col = stack[row] + 1;   // 继续从上一行的下一列开始搜索
            }
        }
    }

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

    free(stack);
}

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

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


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?