日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

leetcode52. N皇后 II 最强解法直接秒杀100%

發布時間:2023/12/13 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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;} }

?

總結

以上是生活随笔為你收集整理的leetcode52. N皇后 II 最强解法直接秒杀100%的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。