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*) * count);
for(int i=0;i<count;i++){
(*returnColumnSizes)[i]=boardSize;
}
return boards;
}
提交多次没过 发现是力扣给的 ** returnColumnSizes 空间声明小了 醉~~~