leetcode 51 N皇后 C语言实现

测评

leetcode 51 N皇后 C语言实现_第1张图片

题目

leetcode 51 N皇后 C语言实现_第2张图片
示例:
输入: 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;
}

你可能感兴趣的:(LeetCode)