69,373
社区成员
发帖
与我相关
我的任务
分享
#define FALSE -1
#define TRUE 1
static int sum = 0; //结果个数
static int capacity = 2; //array数组初始容量
/*将结果保存在array中*/
void output(char ***array, int *a, int n)
{
int i, j;
sum += 1;
/*当容量小于结果个数时,扩容*/
if(sum > capacity)
{
capacity = capacity * 2;
array = (char ***)realloc(array, sizeof(char **) * capacity);
if(array == NULL)
{
printf("array is NULL");
exit(0);
}
}
/*为每个解分配空间保存摆放位置*/
array[sum-1] = (char **)malloc(sizeof(char *) * n);
for(i = 0; i < n; i++)
{
array[sum-1][i] = (char *)malloc(sizeof(char) * (n + 1));
array[sum-1][i][n] = '\0';
for(j = 0; j < n; j++)
{
if(a[i] == j)
array[sum-1][i][j] = 'Q';
else
array[sum-1][i][j] = '.';
}
}
}
/*检测摆放位置有效性*/
int check(int n, int *a)
{
int i;
for(i = 0; i < n; i++)
{
if((abs(n-i) == abs(a[n]-a[i]) || a[n] == a[i]))
return FALSE;
}
return TRUE;
}
/*递归解决问题*/
void NQueens(int t, int n, char ***array, int *a)
{
int i;
if(t == n)
output(array, a, n);
else
{
for(i = 0; i < n; i++)
{
a[t] = i;
if(check(t, a))
NQueens(t+1, n, array, a);
}
}
}
/*初始化并执行NQueens函数,其中一维数组a模拟n×n棋盘*/
char*** solveNQueens(int n, int* returnSize) {
int i;
*returnSize = 0;
char ***answer = (char ***)malloc(sizeof(char **) * 2);
if(n <= 0)
{
return answer;
}
int *a = (int *)malloc(sizeof(int) * n);
for(i = 0; i < n; i++)
{
a[i] = -1;
}
NQueens(0, n, answer, a);
*returnSize = sum;
return answer;
}
array = (char ***)realloc(array, sizeof(char **) * capacity);
这个扩容有问题吧,大小没变化呢,是不是应该是:
array = (char ***)realloc(array, sizeof(char **) * sum);