m0_74039776 2023-12-02 20:38 采纳率: 20%
浏览 6

c,递归求解皇后问题(数据结构),编译过程中地址冲突

这是c语言啊,当时选错话题了
实验内容

  1. 编写程序求解皇后问题
    要求:(1)皇后的个数n 由用户输入,其值不能超过 20:
    (2)采用递归方法求解。
    没有提示错误代码,但就是编译不出来

    img

img

img

img


img

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-12-02 22:56
    关注

    【以下回答由 GPT 生成】

    我需要关于C++递归解决皇后问题的帮助。

    皇后问题是一个经典的递归问题。问题的目标是在一个N×N的国际象棋棋盘上放置N个皇后,使得任意两个皇后都不能互相攻击。皇后可以在同一行、同一列以及同一条对角线上攻击其他皇后。

    以下是一个具体的解决方案:

    1. 定义一个函数isSafe,用于判断当前位置是否安全。该函数接受以下参数:
    2. board:一个二维数组,表示棋盘,其中每个元素的值代表棋盘上对应位置的状态(0表示空,1表示放置了皇后)。
    3. row:当前行数。
    4. col:当前列数。

    isSafe函数中,需要进行以下检查: - 检查当前列上是否已经放置了皇后。 - 检查当前位置的左上方和右上方是否已经放置了皇后。 - 如果以上检查都通过,则当前位置是安全的,返回true,否则返回false

    1. 定义一个递归函数solveNQueens,用于解决皇后问题。该函数接受以下参数:
    2. board:一个二维数组,表示棋盘。
    3. row:当前行数。

    solveNQueens函数中,需要进行以下步骤: - 判断递归结束条件,即是否已经遍历完了所有的行,如果是,则找到了一组解,将其打印出来。 - 遍历当前行的每个列,对于每个位置,检查是否安全,如果是,则将该位置设置为1,然后递归调用solveNQueens处理下一行。 - 如果递归调用返回true,表示找到了解,返回true。 - 如果递归调用返回false,表示当前位置不合适,将该位置重新设置为0,然后继续遍历下一列。

    1. 在主函数中,定义一个N×N的二维数组board,初始化所有元素为0。然后调用solveNQueens函数,传入初始参数board0,开始解决皇后问题。

    下面是上述解决方案的C++代码示例:

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    bool isSafe(vector<vector<int>>& board, int row, int col) {
        // 检查当前列是否已经放置了皇后
        for (int i = 0; i < row; i++) {
            if (board[i][col] == 1) {
                return false;
            }
        }
    
        // 检查左上方是否已经放置了皇后
        for (int i = row, j = col; i >= 0 && j >= 0; i--, j--) {
            if (board[i][j] == 1) {
                return false;
            }
        }
    
        // 检查右上方是否已经放置了皇后
        for (int i = row, j = col; i >= 0 && j < board.size(); i--, j++) {
            if (board[i][j] == 1) {
                return false;
            }
        }
    
        return true;
    }
    
    bool solveNQueens(vector<vector<int>>& board, int row) {
        if (row == board.size()) {
            // 找到了一组解,打印出来
            for (int i = 0; i < board.size(); i++) {
                for (int j = 0; j < board.size(); j++) {
                    cout << board[i][j] << " ";
                }
                cout << endl;
            }
            cout << endl;
    
            // 返回true表示找到了解
            return true;
        }
    
        bool res = false;
        for (int col = 0; col < board.size(); col++) {
            if (isSafe(board, row, col)) {
                board[row][col] = 1;  // 设置当前位置为皇后
    
                // 递归调用处理下一行
                res = solveNQueens(board, row + 1) || res;
    
                board[row][col] = 0;  // 恢复当前位置为空
    
            }
        }
    
        // 返回false表示当前位置不合适
        return res;
    }
    
    int main() {
        int N = 4;  // 棋盘大小
        vector<vector<int>> board(N, vector<int>(N, 0));
    
        solveNQueens(board, 0);
    
        return 0;
    }
    

    以上是一个递归解决皇后问题的具体方案和代码示例,如果您有任何具体的问题或错误信息,请提供更多细节,我会进一步帮助您解决问题。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 修改了问题 12月3日
  • 修改了问题 12月3日
  • 修改了问题 12月3日
  • 修改了问题 12月2日
  • 展开全部

悬赏问题

  • ¥15 两台交换机分别是trunk接口和access接口为何无法通信,通信过程是如何?
  • ¥15 C语言使用vscode编码错误
  • ¥15 用KSV5转成本时,如何不生成那笔中间凭证
  • ¥20 ensp怎么配置让PC1和PC2通讯上
  • ¥50 有没有适合匹配类似图中的运动规律的图像处理算法
  • ¥15 dnat基础问题,本机发出,别人返回的包,不能命中
  • ¥15 请各位帮我看看是哪里出了问题
  • ¥15 vs2019的js智能提示
  • ¥15 关于#开发语言#的问题:FDTD建模问题图中代码没有报错,但是模型却变透明了
  • ¥15 uniapp的h5项目写一个抽奖动画