示例:
输入: 4
输出: [
[".Q…", // 解法 1
“…Q”,
“Q…”,
“…Q.”],
["…Q.", // 解法 2
“Q…”,
“…Q”,
“.Q…”]
]
解释: 4 皇后问题存在两个不同的解法。
//检查行、列、左斜、右斜是否已有皇后
int isExist(int row[], int col[], int lbevel[], int rbevel[], int i, int j, int n) {
int rind = i + j;
int lind = n - 1 - i + j;
return (row[i] || col[j] || lbevel[lind] || rbevel[rind]) == 1;
}
//更新行、列、左斜、右斜的状态,0代表没有皇后,1代表有皇后
void update(int row[], int col[], int lbevel[], int rbevel[], int i, int j, int n, int flag) {
int rind = i + j;
int lind = n - 1 - i + j;
row[i] = flag;
col[j] = flag;
lbevel[lind] = flag;
rbevel[rind] = flag;
}
//回溯法
void backtracking(int n, int *returnSize, int **returnColumnSizes, char ***res, int arr[], int ind, int row[], int col[], int lbevel[], int rbevel[]) {
if (ind == n) {
res[*returnSize] = (char **)malloc(sizeof(char *) * n);
for (int i = 0; i < n; i++) {
res[*returnSize][i] = (char *)malloc(sizeof(char) * (n + 1));
for (int j = 0; j < n; j++) res[*returnSize][i][j] = '.';
res[*returnSize][i][arr[i]] = 'Q';
res[*returnSize][i][n] = '\0';
}
(*returnColumnSizes)[*returnSize] = n;
(*returnSize)++;
return ;
}
for (int j = 0; j < n; j++) {
int x = isExist(row, col, lbevel, rbevel, ind, j, n);
if (x == 1) continue;
arr[ind] = j;
update(row, col, lbevel, rbevel, ind, j, n, 1);
backtracking(n, returnSize, returnColumnSizes, res, arr, ind + 1, row, col, lbevel, rbevel);
update(row, col, lbevel, rbevel, ind, j, n, 0);
}
}
char *** solveNQueens(int n, int* returnSize, int** returnColumnSizes){
int row[n], col[n], lbevel[n * 2], rbevel[n * 2];
for (int i = 0; i < n; i++) {
row[i] = 0;
col[i] = 0;
lbevel[i] = 0;
lbevel[n + i] = 0;
rbevel[i] = 0;
rbevel[n + i] = 0;
}
*returnSize = 0;
char ***res = (char ***)malloc(sizeof(char **) * 1024);
(*returnColumnSizes) = (int *)malloc(sizeof(int) * 1024);
int arr[n];
backtracking(n, returnSize, returnColumnSizes, res, arr, 0, row, col, lbevel, rbevel);
return res;
}