面向答案C语言 2022-12-30 04:25 采纳率: 63.6%
浏览 88
已结题

C语言 力扣51题 N皇后问题 报错堆缓冲区溢出 VS却能成功运行

力扣第51题 N皇后
输入为7的时候显示堆溢出
输入为6的时候运行正常
且在VS运行都没有报错
col数组尝试过开大过 此题代码是力扣第52题 N皇后字母题代码改的(52题只要求输出解法个数,51题要求输出每种解法的棋盘摆法)

img


int col[10];//表示第i行的皇后放在第col[i]列上,即皇后坐标为(i,col[i]);
int count=0;
int boardSize=0;
char *** boards=NULL;
bool check(int x,int y){//默认每行只放一个 故不检查行
    for(int i=1;i<=x;i++){
        if(col[i]==y)//检测前面的每行是否有放在当前列上的皇后
        return false;
        if(i+col[i]==x+y)//检测前面每行是否有放在当前皇后对角线上的皇后
        return false;
        if(i-col[i]==x-y)
        return false;
    }
    return true;
}
void fillBoard(int *data){
    //构造棋盘
    boards=(char ***)realloc(boards,sizeof(char**)*count);
    boards[count-1]=(char**)malloc(sizeof(char*)*boardSize);
    for(int i=0;i<boardSize;i++){
        boards[count-1][i]=(char*)calloc(boardSize+1,sizeof(char));
        memset(boards[count-1][i],'.',boardSize);//初始化棋盘
    }
    //写入皇后
    for(int i=1;i<=boardSize;i++){
        boards[count-1][i-1][data[i]-1]='Q';
    }
}
void dfs(int row){
    if(row==boardSize+1){
        count++;
        fillBoard(col);
        return;
    }
    for(int i=1;i<=boardSize;i++){
        if(check(row,i)==true){
            col[row]=i;
            dfs(row+1);
            col[row]=0;//归零 无论找到找不到都要归零 不然后面再找的时候会出错
        }
    }
}

char *** solveNQueens(int n, int* returnSize, int** returnColumnSizes){
    memset(col,0,4*10);
    count=0;
    boardSize=n;
    boards=NULL;
    dfs(1);
    *returnSize=count;
    *returnColumnSizes = malloc(sizeof(int*) * boardSize);
    for(int i=0;i<count;i++){
        (*returnColumnSizes)[i]=boardSize;
    }
    return boards;
}

上为我的代码
当输入为6的时候,还是能顺利跑过 当输入为7的时候就会报错

img


上为报错内容

img


输入6 成功跑过
力扣51题是52题的子母题 我在52题的基础上添加了fillBoard函数 其他函数运行52题的时候AC
在VS运行的时候页也可以跑 并且答案是对的

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdbool.h>
#include<stdlib.h>
int col[10];//表示第i行的皇后放在第col[i]列上,即皇后坐标为(i,col[i]);
int count = 0;
int boardSize = 0;
char*** boards = NULL;
void prind(char** board) {
    for (int i = 0;i < boardSize;i++) {
        printf("%s\n", board[i]);
    }
    printf("\n");
}
bool check(int x, int y) {//默认每行只放一个 故不检查行
    for (int i = 1;i <= x;i++) {
        if (col[i] == y)//检测前面的每行是否有放在当前列上的皇后
            return false;
        if (i + col[i] == x + y)//检测前面每行是否有放在当前皇后对角线上的皇后
            return false;
        if (i - col[i] == x - y)
            return false;
    }
    return true;
}
void fillBoard(int* data) {
    //构造棋盘
    boards = (char***)realloc(boards, sizeof(char**) * count);
    boards[count - 1] = (char**)malloc(sizeof(char*) * boardSize);
    for (int i = 0;i < boardSize;i++) {
        boards[count - 1][i] = (char*)calloc(boardSize + 1, sizeof(char));
        memset(boards[count - 1][i], '.', boardSize);//初始化棋盘
        boards[count - 1][i][boardSize] = '\0';
    }
    //写入皇后
    for (int i = 1;i <= boardSize;i++) {
        boards[count - 1][i - 1][data[i] - 1] = 'Q';
    }
    //prind(boards[count - 1]);

}
void dfs(int row) {
    if (row == boardSize + 1) {
        count++;
        fillBoard(col);
        return;
    }
    for (int i = 1;i <= boardSize;i++) {
        if (check(row, i) == true) {
            col[row] = i;
            dfs(row + 1);
            col[row] = 0;//归零 无论找到找不到都要归零 不然后面再找的时候会出错
        }
    }
}
char*** solveNQueens(int n, int* returnSize) {
    memset(col, 0, 4 * 10);
    count = 0;
    boardSize = n;
    boards = NULL;
    dfs(1, boards);
    *returnSize = count;
    /**returnColumnSizes = malloc(sizeof(int*) * boardSize);
    for (int i = 0;i < count;i++) {
        (*returnColumnSizes)[i] = boardSize;
    }*/
    for (int i = 0;i < count;i++) {
        prind(boards[i]);
    }
    return boards;
}
int main() {
    int resultssize = 0;
    char*** results = solveNQueens(7, &resultssize);
    return 0;
}

上为VS代码

img


此为VS运行结果 与答案一致
百思不得其解

  • 写回答

4条回答 默认 最新

  • heart_6662 2022-12-30 07:37
    关注

    我尝试改一下代码,等会给你。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月31日
  • 创建了问题 12月30日

悬赏问题

  • ¥15 求一款免费的pdf编辑js,web端用的
  • ¥30 申威平台是否兼容使用cmake,需要cmake版本在3.15版本以上
  • ¥20 UE5.2插件Remote Control Web Interface安装失败问题
  • ¥15 c#调用c++方法提示错误 无法封送处理泛型类型
  • ¥15 求分析下图晶体与三极管组成的振荡电路
  • ¥100 多线程+连接池+代理 运行一段时间线程阻塞
  • ¥15 关于#单片机#的问题:求一个使用C语言将重力加速度gx,gy,gz积分获取到速度的代码(相关搜索:c语言)
  • ¥15 matlab导致电脑重启问题
  • ¥15 Android studio打开dex
  • ¥20 为何R语言love图显示的分类变量点与smd值不一致