最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實(shí)現(xiàn)LeetCode(52.N皇后問(wèn)題之二)

 更新時(shí)間:2021年07月15日 17:06:03   作者:Grandyang  
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(52.N皇后問(wèn)題之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

[LeetCode] 52. N-Queens II N皇后問(wèn)題之二

The n-queens puzzle is the problem of placing nqueens on an n×n chessboard such that no two queens attack each other.

Given an integer n, return the number of distinct solutions to the n-queens puzzle.

Example:

Input: 4
Output: 2
Explanation: There are two distinct solutions to the 4-queens puzzle as shown below.
[
[".Q..",  // Solution 1
"...Q",
"Q...",
"..Q."],

 ["..Q.",  // Solution 2
"Q...",
"...Q",
".Q.."]
]

這道題是之前那道 N-Queens 的延伸,說(shuō)是延伸其實(shí)我覺(jué)得兩者順序應(yīng)該顛倒一樣,上一道題比這道題還要稍稍復(fù)雜一些,兩者本質(zhì)上沒(méi)有啥區(qū)別,都是要用回溯法 Backtracking 來(lái)解,如果理解了之前那道題的思路,此題只要做很小的改動(dòng)即可,不再需要求出具體的皇后的擺法,只需要每次生成一種解法時(shí),計(jì)數(shù)器加一即可,代碼如下:

解法一:

class Solution {
public:
    int totalNQueens(int n) {
        int res = 0;
        vector<int> pos(n, -1);
        helper(pos, 0, res);
        return res;
    }
    void helper(vector<int>& pos, int row, int& res) {
        int n = pos.size();
        if (row == n) ++res;
        for (int col = 0; col < n; ++col) {
            if (isValid(pos, row, col)) {
                pos[row] = col;
                helper(pos, row + 1, res);
                pos[row] = -1;
            }
        }
    }
    bool isValid(vector<int>& pos, int row, int col) {
        for (int i = 0; i < row; ++i) {
            if (col == pos[i] || abs(row - i) == abs(col - pos[i])) {
                return false;
            }
        }
        return true;
    }
};

但是其實(shí)我們并不需要知道每一行皇后的具體位置,而只需要知道會(huì)不會(huì)產(chǎn)生沖突即可。對(duì)于每行要新加的位置,需要看跟之前的列,對(duì)角線,及逆對(duì)角線之間是否有沖突,所以我們需要三個(gè)布爾型數(shù)組,分別來(lái)記錄之前的列 cols,對(duì)角線 diag,及逆對(duì)角線 anti_diag 上的位置,其中 cols 初始化大小為n,diag 和 anti_diag 均為 2n。列比較簡(jiǎn)單,是哪列就直接去 cols 中查找,而對(duì)角線的話,需要處理一下,如果我們仔細(xì)觀察數(shù)組位置坐標(biāo)的話,可以發(fā)現(xiàn)所有同一條主對(duì)角線的數(shù),其縱坐標(biāo)減去橫坐標(biāo)再加n,一定是相等的。同理,同一條逆對(duì)角線上的數(shù)字,其橫縱坐標(biāo)之和一定是相等的,根據(jù)這個(gè),就可以快速判斷主逆對(duì)角線上是否有沖突。任意一個(gè)有沖突的話,直接跳過(guò)當(dāng)前位置,否則對(duì)于新位置,三個(gè)數(shù)組中對(duì)應(yīng)位置都賦值為 true,然后對(duì)下一行調(diào)用遞歸,遞歸返回后記得還要還原狀態(tài),參見(jiàn)代碼如下:

解法二:

class Solution {
public:
    int totalNQueens(int n) {
        int res = 0;
        vector<bool> cols(n), diag(2 * n), anti_diag(2 * n);
        helper(n, 0, cols, diag, anti_diag, res);
        return res;
    }
    void helper(int n, int row, vector<bool>& cols, vector<bool>& diag, vector<bool>& anti_diag, int& res) {
        if (row == n) ++res;
        for (int col = 0; col < n; ++col) {
            int idx1 = col - row + n, idx2 = col + row;
            if (cols[col] || diag[idx1] || anti_diag[idx2]) continue;
            cols[col] = diag[idx1] = anti_diag[idx2] = true;
            helper(n, row + 1, cols, diag, anti_diag, res);
            cols[col] = diag[idx1] = anti_diag[idx2] = false;
        }
    }
};

到此這篇關(guān)于C++實(shí)現(xiàn)LeetCode(52.N皇后問(wèn)題之二)的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)N皇后問(wèn)題之二內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談C++ IO流

    淺談C++ IO流

    這篇文章主要介紹了C++ IO流的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-08-08
  • c++基礎(chǔ)語(yǔ)法:構(gòu)造函數(shù)與析構(gòu)函數(shù)

    c++基礎(chǔ)語(yǔ)法:構(gòu)造函數(shù)與析構(gòu)函數(shù)

    構(gòu)造函數(shù)用來(lái)構(gòu)造一個(gè)對(duì)象,主要完成一些初始化工作,如果類(lèi)中不提供構(gòu)造函數(shù),編譯器會(huì)默認(rèn)的提供一個(gè)默認(rèn)構(gòu)造函數(shù)(參數(shù)為空的構(gòu)造函數(shù)就是默認(rèn)構(gòu)造函數(shù)) ;析構(gòu)函數(shù)是隱式調(diào)用的,delete對(duì)象時(shí)候會(huì)自動(dòng)調(diào)用完成對(duì)象的清理工作
    2013-09-09
  • C++實(shí)現(xiàn)簡(jiǎn)單酒店管理系統(tǒng)

    C++實(shí)現(xiàn)簡(jiǎn)單酒店管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單酒店管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C語(yǔ)言 function recursion函數(shù)遞歸詳解

    C語(yǔ)言 function recursion函數(shù)遞歸詳解

    遞歸指的是在函數(shù)的定義中使用函數(shù)自身的方法,舉個(gè)例子: 從前有座山,山里有座廟,廟里有個(gè)老和尚,正在給小和尚講故事呢!故事是什么呢?"從前有座山,山里有座廟,廟里有個(gè)老和尚,正在給小和尚講故事呢!故事是什么呢?"從前有座山,山里有座廟,循環(huán)下去
    2021-10-10
  • Pthread并發(fā)編程之線程基本元素和狀態(tài)的剖析

    Pthread并發(fā)編程之線程基本元素和狀態(tài)的剖析

    本篇文章主要給大家介紹pthread并發(fā)編程當(dāng)中關(guān)于線程的基礎(chǔ)概念,并且深入剖析進(jìn)程的相關(guān)屬性和設(shè)置,以及線程在內(nèi)存當(dāng)中的布局形式,幫助大家深刻理解線程
    2022-11-11
  • C++之CWnd窗口框架實(shí)例

    C++之CWnd窗口框架實(shí)例

    這篇文章主要介紹了C++之CWnd窗口框架,實(shí)例分析了CWnd窗口框架的結(jié)構(gòu),如構(gòu)造函數(shù)、析構(gòu)函數(shù)、消息映射函數(shù)等,需要的朋友可以參考下
    2014-10-10
  • Qt自定義美化滑動(dòng)條

    Qt自定義美化滑動(dòng)條

    這篇文章主要為大家詳細(xì)介紹了Qt自定義美化滑動(dòng)條的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • C++入門(mén)(命名空間,缺省參數(shù),函數(shù)重載,引用,內(nèi)聯(lián)函數(shù),auto,范圍for)

    C++入門(mén)(命名空間,缺省參數(shù),函數(shù)重載,引用,內(nèi)聯(lián)函數(shù),auto,范圍for)

    這篇文章主要介紹了C++入門(mén)(命名空間,缺省參數(shù),函數(shù)重載,引用,內(nèi)聯(lián)函數(shù),auto,范圍for),這些基礎(chǔ)知識(shí)是學(xué)習(xí)C++最最基礎(chǔ)需要掌握的知識(shí)點(diǎn),需要的朋友可以參考下
    2021-05-05
  • C語(yǔ)言實(shí)現(xiàn)經(jīng)典掃雷游戲流程

    C語(yǔ)言實(shí)現(xiàn)經(jīng)典掃雷游戲流程

    掃雷是電腦上很經(jīng)典的游戲,特意去網(wǎng)上玩了一會(huì),幾次調(diào)試之后,發(fā)現(xiàn)這個(gè)比三子棋要復(fù)雜一些,尤其是空白展開(kāi)算法上和堵截玩家有的一拼,與實(shí)際游戲差別較大,不能使用光標(biāo),下面來(lái)詳解每一步分析
    2021-11-11
  • vscode+wsl運(yùn)行編譯c++的實(shí)現(xiàn)

    vscode+wsl運(yùn)行編譯c++的實(shí)現(xiàn)

    本文主要介紹了vscode+wsl運(yùn)行編譯c++的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04

最新評(píng)論

黄冈市| 淅川县| 嘉禾县| 明溪县| 赣榆县| 双峰县| 公安县| 遂昌县| 澎湖县| 达孜县| 昆山市| 聂荣县| 山西省| 湖北省| 望谟县| 莱阳市| 区。| 竹北市| 德化县| 聂拉木县| 遵义县| 阿坝| 闵行区| 郎溪县| 乌拉特后旗| 伊川县| 涟源市| 武平县| 巴青县| 广水市| 资兴市| 汤原县| 富顺县| 永泰县| 九台市| 涿鹿县| 龙门县| 池州市| 安顺市| 上虞市| 宜君县|