leetcode52. N皇后 II 最強解法直接秒殺100%

n?皇后問題研究的是如何將 n?個皇后放置在 n×n 的棋盤上,并且使皇后彼此之間不能相互攻擊。

上圖為 8 皇后問題的一種解法。

給定一個整數 n,返回 n 皇后不同的解決方案的數量。

示例:

輸入: 4
輸出: 2
解釋: 4 皇后問題存在如下兩個不同的解法。
[
?[".Q..", ?// 解法 1
??"...Q",
??"Q...",
??"..Q."],

?["..Q.", ?// 解法 2
??"Q...",
??"...Q",
??".Q.."]
]

思路:詳見:皇后問題詳細解釋。

public class Solution {public int totalNQueens(int n) {// 因為本方法中位運算的載體是int型變量,所以該方法只能算1~32皇后問題// 如果想計算更多的皇后問題,需使用包含更多位的變量if (n < 1 || n > 32) {return 0;}int upperLim = n == 32 ? -1 : (1 << n) - 1;//upperLim的作用為棋盤大小,比如8皇后為00000000 00000000 00000000 11111111//32皇后為11111111 11111111 11111111 11111111return process2(upperLim, 0, 0, 0);}public int process2(int upperLim, int colLim, int leftDiaLim,int rightDiaLim) {if (colLim == upperLim) {return 1;}int pos = 0;            //pos:所有的合法位置int mostRightOne = 0;   //所有合法位置的最右位置//所有記錄按位或之后取反,并與全1按位與,得出所有合法位置pos = upperLim & (~(colLim | leftDiaLim | rightDiaLim));int res = 0;//計數while (pos != 0) {mostRightOne = pos & (~pos + 1);//取最右的合法位置pos = pos - mostRightOne;       //去掉本位置并嘗試res += process2(upperLim,                             //全局colLim | mostRightOne,                //列記錄//之前列+本位置(leftDiaLim | mostRightOne) << 1,      //左斜線記錄//(左斜線變量+本位置)左移             (rightDiaLim | mostRightOne) >>> 1);   //右斜線記錄//(右斜線變量+本位置)右移(高位補零)}return res;}
}

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444420.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444420.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444420.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言:---gdb多線程調試

1)恢復程序運行和單步調試 當程序被停住了,你可以用continue命令恢復程序的運行直到程序結束,或下一個斷點到來。也可以使用step或next命令單步跟蹤程序。 continue [ignore-count] c [ignore-count] fg [ignore-count] 恢復程序運行,直到程序結束,或是下一個斷點到來。ig…

leetcode145. 二叉樹的后序遍歷 意想不到的騷操作

給定一個二叉樹&#xff0c;返回它的 后序 遍歷。 示例: 輸入: [1,null,2,3] 1 \ 2 / 3 輸出: [3,2,1] 進階: 遞歸算法很簡單&#xff0c;你可以通過迭代算法完成嗎&#xff1f; 思路&#xff1a;前序遍歷左右交換&#xff0c;然后倒序輸出 原因&am…

C++:29 --- C++繼承關系下的內存布局(下)

1 單繼承 C++ 提供繼承的目的是在不同的類型之間提取共性。比如,科學家對物種進行分類,從而有種、屬、綱等說法。有了這種層次結構,我們才可能將某些具備特定性質的東西歸入到最合適的分類層次上,如“懷孩子的是哺乳動物”。由于這些屬性可以被子類繼承,所以,我們只要知道…

C++:30 ---C++類成員,成員函數的內存布局

前面兩篇文章我相信大家反復讀了之后對這節不陌生了: 首先來看代碼: class Demo { public://靜態成員變量static const int sx = 0;//靜態函數static void SF1() {} public://成員變量int x; public://成員函數void F1() {cout << "Im from Demo::F1()" <…

leetcode119. 楊輝三角 II 你能比我代碼更短嗎?

給定一個非負索引 k&#xff0c;其中 k ≤ 33&#xff0c;返回楊輝三角的第 k 行。 示例: 輸入: 3 輸出: [1,3,3,1]按照定義寫即可。 class Solution:def getRow(self, rowIndex: int) -> List[int]:l[1]for i in range(rowIndex):l[1][l[j]l[j1] for j in range(len(l)-1…

C++:28 --- C++內存布局(上)

了解你所使用的編程語言究竟是如何實現的,對于C++程序員可能特別有意義。 首先,我們順次考察C兼容的結構(struct)的布局,單繼承,多重繼承,以及虛繼承;接著,我們講成員變量和成員函數的訪問,當然,這里面包含虛函數的情況;再接下來,我們考察構造函數,析構函數,以…

leetcode114. 二叉樹展開為鏈表

給定一個二叉樹&#xff0c;原地將它展開為鏈表。 例如&#xff0c;給定二叉樹 1 / \ 2 5 / \ \ 3 4 6 將其展開為&#xff1a; 1 \ 2 \ 3 \ 4 \ 5 \ 6 思路&#xff1a;所有左子樹的最右節點接上右子…

C++:26---動態內存管理new、delete

實在不好意思,到這里才給大家分享new和delete。 對于非內部數據類型的對象而言,光用malloc/free無法滿足動態對象的要求。對象在創建的同時要自動執行構造函數,對象在消亡之前要自動執行析構函數。 由于malloc/free是庫函數而不是運算符,不在編譯器控制權限…

使用Log4j為項目配置日志輸出應用詳細總結及示例演示.

Log4j組件構成 Log4j由三個重要的組件構成&#xff1a; 1.日志信息的優先級(Logger) 2.日志信息的輸出目的地(Appender) 3.日志信息的輸出格式(Layout)。 概要: 日志信息的優先級從高到低有ERROR、WARN、INFO、DEBUG&#xff0c;分別用來指定這條日志信息的重要程度&…

C++:27---new delete malloc free

上一節我講了new和delete,有人問這不是和C語言的malloc/free為C的標準庫函數差不多么 void* malloc(size_t size)//參數代表字節個數 void free(void* pointer)//參數代表內存地址new、delete則為C++的操作運算符,它調用的分別為賦值運算符重載operator new()和operator del…

C++:33---類成員指針

成員指針概述: 當初始化一個這樣的指針時,我們令其指向類的某個成員,但是不指定該成員所屬的對象直到使用成員指針時,才提供成員所屬的對象成員指針是指可以指向類的非靜態成員的指針一般情況下,指針指向一個對象,但是成員指針指向的是類的成員,而不是類的所創建出的對象…

C++:31---對象引用和賦值

一、對象移動概述 C++11標準引入了“對象移動”的概念對象移動的特性是:可以移動而非拷貝對象在C++舊標準中,沒有直接的方法移動對象。因此會有很多不必要的資源拷貝標準庫容器、string、share_ptr類既支持移動也支持拷貝。IO類和unique_ptr類可以移動但不能拷貝對象移動的特…

C++:34---union:聯合/共用體,一種節省空間的類

一、聯合(union)概述 聯合(union)是一種特殊的類一個union可以有多個數據成員,但是在任意時刻只有一個數據成員可以有值。當我們給union的某個成員賦值之后,該union的其它成員就變成未定義的狀態了。分配給一個union對象的存儲空間至少要能容納它的最大的數據成員類的某些…

leetcode205. 同構字符串 一般人一次做不對的簡單題

給定兩個字符串 s 和 t&#xff0c;判斷它們是否是同構的。 如果 s 中的字符可以被替換得到 t &#xff0c;那么這兩個字符串是同構的。 所有出現的字符都必須用另一個字符替換&#xff0c;同時保留字符的順序。兩個字符不能映射到同一個字符上&#xff0c;但字符可以映射自己…

C++:32---IO庫

一、IO庫 I0庫類型和頭文件頭文件類型iostreamistream,wistream從流讀取數據ostream,wostream向流寫入數據iostream,wiostream讀寫流fstreamifstream,wifstream從文件讀取數據ofstream,wofstream向文件寫入數據fstream,wfstream讀寫文件sstreamistringstream,wistringst

leetcode209. 長度最小的子數組 借這個題規范一下雙指針寫法

給定一個含有 n 個正整數的數組和一個正整數 s &#xff0c;找出該數組中滿足其和 ≥ s 的長度最小的連續子數組。如果不存在符合條件的連續子數組&#xff0c;返回 0。 示例: 輸入: s 7, nums [2,3,1,2,4,3] 輸出: 2 解釋: 子數組 [4,3] 是該條件下的長度最小的連續子數組…

C++(STL):01---pair容器

一、pair歷史概述 C++標準庫的第1版(C++98),提供了一個簡單的class,用來處理類型不同的兩個(一對)值,這個就是pair。到了C++11,pair被重新定義,有了很大擴展pair與tuple:tuple在TR1被引入,它是對pair的擴展tuple在后面詳細概述。二、pair概述 特點: 一個pair保存兩…

C++(STL):02---tuple容器

一、tuple的歷史概述 Tuple是TR1引入的東西,它擴展了pair的概念,擁有任意數量的元素。在C++11標準之前,tuple最多帶有10個類型不同的元素C++11,tuple被重新定義,采用variadic template概念,被設計為可用于任意大小的異質集合二、tuple概述 tuple與pair類似,也是一個模板…

C++(STL):06---數值的極值(numeric_limits類)

一、數值的極值概述 數值類型有著與平臺相依的極值C++標準規定了各種類型必須保證的最小精度。這些最小值如下圖所示: 類型最小長度char1byte(8bits)shortint2bytesint2byteslongint4bytes

leetocde 225. 用隊列實現棧

使用隊列實現棧的下列操作&#xff1a; push(x) -- 元素 x 入棧 pop() -- 移除棧頂元素 top() -- 獲取棧頂元素 empty() -- 返回棧是否為空 注意: 你只能使用隊列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 這些操作是合法的。 你所使用的語…