代码随想录算法训练营29期Day30|LeetCode 332,51,37

 文档讲解:回溯算法总结篇  重新安排行程  N皇后  解数独

51.N皇后

题目链接:https://leetcode.cn/problems/permutations/description/

思路:

        本题的基本含义就是有个N*N的棋盘,需要我们放N个皇后在上面,满足不能有任意两个皇后位于同一行或者同一列或者同一对角线。

        这题我们可以按行搜索,每行放一个,这样保证了行不重复,递归边界条件为放到第N+1行,这证明前N行找出来了一种答案。下面考虑列和对角线如何不重复:

        1.针对列,我们开设一个全局bool数组,标记哪列已经放上了。在搜索每行枚举每个点时,判断该列是否有皇后即可,有就跳过,没有放上皇后搜下一行。

        2.针对正对角线,我们知道位于同一正对角线上的点有一个性质:横纵坐标之和相等,因此我们针对坐标和开一个全局bool数组,标记放过皇后的点的坐标和即可,逻辑类似1。

        3.针对斜对角线,有类似2的性质:横纵坐标之差相等。也针对这个差开个标记数组即可。

        有上面三个标记数组,按行搜索就行了。

核心代码:

class Solution {
private:
    bool flag[10],book1[20],book2[20];
    int maxline;
    vector path;
    vector> ans;
    void dfs(int x){
        if(x==maxline){
            ans.push_back(path);
            return;
        }
        for(int i=0;i> solveNQueens(int n) {
        maxline=n;
        memset(flag,false,sizeof(flag));
        memset(book1,false,sizeof(book1));
        memset(book2,false,sizeof(book2));
        dfs(0);
        return ans;
    }
};

今日总结

        今日学习时长3h,题目很难,我只会做N皇后,还是因为以前做过,所以很快就写出来了。第一道基本想出了思路,但是映射关系定义的不好就没写出来,没想到map套map。第三题想了很久但没啥好思路,今天没时间总结其他两道了,放在周末吧。

你可能感兴趣的:(代码随想录算法训练营29期,算法,leetcode,c++,职场和发展)