51. N皇后

分析:

代码实现:

cpp 复制代码
/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */

bool isValid(char **res, int row, int col, int n) {
    // 检查列
    for (int i = 0; i < row; i++) {
        if (res[i][col] == 'Q') {
            return false;
        }
    }
    // 检查 45度角是否有皇后
    for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
        if (res[i][j] == 'Q') {
            return false;
        }
    }
    // 检查 135度角是否有皇后
    for(int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {
        if (res[i][j] == 'Q') {
            return false;
        }
    }
    return true;
}

void DFS(char ***ans, int *returnSize, int **returnColumnSizes, char **res, int index, int n) { 
    // 枚举到最后一行,保存当前棋盘,因为如果不能成为皇后就不能进入下一行
    // 所以能到最后一行肯定是有效的
    if (index == n) {
        ans[(*returnSize)] = (char**)malloc(sizeof(char *) * n);
        for (int i = 0; i < n; i++) {
            ans[(*returnSize)][i] = (char*)malloc(sizeof(char) * (n + 1));
            strcpy(ans[(*returnSize)][i], res[i]);
        }
        (*returnColumnSizes)[(*returnSize)++] = n;
        return;
    }
    // 枚举当前行中每一个元素
    for (int i = 0; i < n; i++) {
        if (isValid(res, index, i, n) == true) { // 检查当前位置能不能放皇后
            res[index][i] = 'Q'; // 可以直接放皇后
            DFS(ans, returnSize, returnColumnSizes, res, index + 1, n); // 进入下一行,重复当前步骤
            res[index][i] = '.'; // 回溯,进行判断下一个元素
        }
    }
}

char ***solveNQueens(int n, int *returnSize, int **returnColumnSizes){
    char ***ans = (char***)malloc(sizeof(char**) * 1000);
    *returnColumnSizes = (int*)malloc(sizeof(int) * 1000);
    *returnSize = 0;
    char **res = (char**)malloc(sizeof(char *) * n);
    for (int i = 0; i < n; i++) { // 定义棋盘并初始化
        res[i] = (char*)malloc(sizeof(char) * (n + 1));
        memset(res[i], '.', sizeof(char) * n);
        res[i][n] = '\0';
    }
    // 递归枚举每一个位置
    DFS(ans, returnSize, returnColumnSizes, res, 0, n);

    return ans;
}
相关推荐
Adorable老犀牛22 分钟前
阿里云-基于通义灵码实现高效 AI 编码 | 8 | 上手实操:LeetCode学习宝典,通义灵码赋能算法高效突破
学习·算法·leetcode
林木辛1 小时前
LeetCode 热题 160.相交链表(双指针)
算法·leetcode·链表
崎岖Qiu2 小时前
leetcode380:RandomizedSet - O(1)时间插入删除和获取随机元素(数组+哈希表的巧妙结合)
java·数据结构·算法·leetcode·力扣·散列表
好易学·数据结构2 小时前
可视化图解算法60: 矩阵最长递增路径
数据结构·算法·leetcode·力扣·递归·回溯算法·牛客
大锦终3 小时前
【算法】栈专题
数据结构·c++·算法·leetcode
天选之女wow3 小时前
【代码随想录算法训练营——Day6(Day5周日休息)】哈希表——242.有效的字母异位词、349.两个数组的交集、202.快乐数、1.两数之和
数据结构·算法·leetcode·散列表
我想吃烤肉肉3 小时前
leetcode-python-2154将找到的值乘以 2
python·算法·leetcode
Mr_Xuhhh12 小时前
项目需求分析(2)
c++·算法·leetcode·log4j
Morri312 小时前
[Java恶补day53] 45. 跳跃游戏Ⅱ
java·算法·leetcode
林木辛13 小时前
LeetCode热题 15.三数之和(双指针)
算法·leetcode·双指针