力扣第51题 N皇后
输入为7的时候显示堆溢出
输入为6的时候运行正常
且在VS运行都没有报错
col数组尝试过开大过 此题代码是力扣第52题 N皇后字母题代码改的(52题只要求输出解法个数,51题要求输出每种解法的棋盘摆法)
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的时候就会报错
上为报错内容
输入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代码
此为VS运行结果 与答案一致
百思不得其解