[力扣题解]51. N皇后

题目:51. N皇后

思路

回溯法

代码

cpp 复制代码
class Solution {
public:
    vector<vector<string>> result;
    bool right(int row, int col, int n, vector<string>& board)
    {
        int i, j;
        // 不能同行, 这里我又没有写错,为什么结果不对呢?
        // `不能同行` 其实可以不需要判断
        for(j = 0; j < col; j++)
        {
            if(board[row][j] == 'Q')
            {
                return false;
            }
        }
    
        // 不能同列
        for(i = 0; i < row; i++)
        {
            if(board[i][col] == 'Q')
            {
                return false;
            }
        }
        // 不能同一斜线
        
        /* (1)
            \
             \
              \
        */
        for(i = row-1, j = col-1; i >= 0 && j >= 0;i--, j--)
        {
            if(board[i][j] == 'Q')
            {
                return false;
            }
        }
        /* (2)
             /
            /
           /
        */
        for(i = row-1, j = col+1; i >= 0 && j < n; i--, j++)
        {
            if(board[i][j] == 'Q')
            {
                return false;
            }
        }
        return true;
    }

    void function(int n, int row, vector<string>& board)
    {
        if(row == n)
        {
            result.push_back(board);
            return;
        }
        int i;
        
        // i : 列 
        for(i = 0; i < n; i++)
        {
            if(right(row, i, n, board))
            {
                board[row][i] = 'Q';
                function(n, row+1, board);
                board[row][i] = '.';
            }
        }
        return;
    }

    vector<vector<string>> solveNQueens(int n) {
        result.clear();
        std::vector<std::string> board(n, std::string(n, '.'));
        function(n, 0, board);
        return result;
    }   
};

其中判断合法性的时候,"不能同行"其实可以不用写,因为这是在递归过程中,只会选取for循环里一个元素,接下来就递归到下一层去了(下一行),所以可以不用判断"不能同行";

注意:在通常回溯法写path的地方改成了board(就改了个名字),当成二维数组来对待;

同时二位数组大小和棋盘相等,不可以像以往为了图省事故意创建一个大一点的数组(比如一般会凑整数,n=6,直接int path[10];

相关推荐
json{shen:"jing"}14 分钟前
字符串中的第一个唯一字符
算法·leetcode·职场和发展
追随者永远是胜利者1 小时前
(LeetCode-Hot100)15. 三数之和
java·算法·leetcode·职场和发展·go
程序员酥皮蛋2 小时前
hot 100 第二十七题 27.合并两个有序链表
数据结构·leetcode·链表
BlockWay2 小时前
西甲赛程搬进平台:WEEX以竞猜开启区域合作落地
大数据·人工智能·算法·安全
im_AMBER3 小时前
Leetcode 121 翻转二叉树 | 二叉树中的最大路径和
数据结构·学习·算法·leetcode
mit6.8244 小时前
二分+贪心
算法
programhelp_5 小时前
特斯拉 MLE 超详细面经 + 避坑
数据结构·人工智能·算法·面试·职场和发展
越甲八千5 小时前
深入了解迭代器erase()之后的失效逻辑
算法
躺柒5 小时前
读人工智能全球格局:未来趋势与中国位势06人类的未来(下)
大数据·人工智能·算法·ai·智能
L_Aria5 小时前
6421. 【NOIP2019模拟11.11】匹配
c++·算法·动态规划