ewww_7 2024-04-08 15:26 采纳率: 50%
浏览 1
已结题

二维数组解皇后问题的输出不太对

二维数组解皇后问题
在网上看到的解法大都是一维数组,但看到该题的第一想法是用二维数组,尝试后输出不对,有没有佬看看是哪里出了问题

#include <iostream>

using namespace std;

const int N = 11;

char path[N][N];
bool state[N * 2][N * 2];
int n;

void dfs(int u)
{
    if (u > n) {
        for (int i = 1; i <= n; i ++){
            for (int j = 1; j <= n; j ++) cout << path[i][j];
            cout << endl;
        }
        cout << endl;
        return;
    }
    
    for (int i = 1; i <= n; i ++) {
        // for (int j = 1; j <= n; j ++) {
            if (!state[u][i]) {
                
                path[u][i] = 'Q';
                state[u][i] = 1;
                
                for (int x = 1; x <= n; x ++) {
                    state[x][x + u - i] = 1;

                    state[x][-x + u + i] = 1;

                    state[x][u] = 1;
                }
                
                dfs(u + 1);
                
                for (int x = 0; x <= n; x ++) {
                    state[x][x + u - i] = 0;

                    state[x][-x + u + i] = 0;

                    state[x][u] = 0;
                }
                
                path[u][i] = '.';
                state[u][i] = 0;
            }
            
        // }
    }
}

int main()
{
    cin >> n;
    
    for (int i = 1; i <= n; i ++) {
        for (int j = 1; j <= n; j ++) path[i][j] = '.';
    }
    
    dfs (1);
    
    return 0;
}

输出如下:
输入
4

输出

img

  • 写回答

4条回答 默认 最新

  • GISer Liu 2024-04-08 16:21
    关注

    该回答引用自GPT-3.5,由博主GISer Liu编写:

    这个问题主要出在你的状态数组state的大小不够,导致在标记攻击范围时越界了。
    首先,你定义的状态数组state的大小是N*2 x N*2,但是当你在计算对角线上的攻击范围时,下标会超过这个范围。对于一个N x N的棋盘,对角线的攻击范围最大可能达到2*N - 1,因此你的状态数组大小应该至少是(2*N - 1) x (2*N - 1)
    其次,你在对角线上标记攻击范围时出现了问题,具体地说,你在计算对角线上的攻击范围时,需要根据当前皇后的位置``` (u, i)

    下面是修改后的代码:
    cppCopy code
    

    #include
    using namespace std;
    const int N = 11;
    char path[N][N];
    bool state[2N - 1][2N - 1]; // 修改状态数组的大小
    int n;
    void dfs(int u) {
    if (u > n) {
    for (int i = 1; i <= n; i ++) {
    for (int j = 1; j <= n; j ++) cout << path[i][j];
    cout << endl;
    }
    cout << endl;
    return;
    }
    for (int i = 1; i <= n; i ++) {
    // 检查行、列、对角线是否冲突
    if (!state[i - 1][u - 1] && !state[i - 1][n + u - 1] && !state[n + i - 1][u - 1]) {
    path[i][u] = 'Q';
    state[i - 1][u - 1] = state[i - 1][n + u - 1] = state[n + i - 1][u - 1] = 1;
    dfs(u + 1);
    path[i][u] = '.';
    state[i - 1][u - 1] = state[i - 1][n + u - 1] = state[n + i - 1][u - 1] = 0;
    }
    }
    }
    int main() {
    cin >> n;
    for (int i = 1; i <= n; i ++) {
    for (int j = 1; j <= n; j ++) path[i][j] = '.';
    }
    dfs(1);
    return 0;
    }

    ```
    这样修改后,你应该能够正确输出皇后问题的解了。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月16日
  • 已采纳回答 4月8日
  • 创建了问题 4月8日

悬赏问题

  • ¥30 arduino vector defined in discarded section `.text' of wiring.c.o (symbol from plugin)
  • ¥20 关于#c++#的问题:(2)运算二叉树·表达式一般由一个运算符和两个操作数组成:(相关搜索:二叉树遍历)
  • ¥20 如何训练大模型在复杂因素组成的系统中求得最优解
  • ¥15 关于#r语言#的问题:在进行倾向性评分匹配时,使用“match it"包提示”错误于eval(family$initialize): y值必需满足0 <= y <= 1“请问在进行PSM时
  • ¥45 求17位带符号原码乘法器verilog代码
  • ¥20 PySide6扩展QLable实现Word一样的图片裁剪框
  • ¥15 matlab数据降噪处理,提高数据的可信度,确保峰值信号的不损失?
  • ¥15 怎么看我在bios每次修改的日志
  • ¥15 python+mysql图书管理系统
  • ¥15 Questasim Error: (vcom-13)