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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[leetcode] N-Queens II

發布時間:2023/11/30 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [leetcode] N-Queens II 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

N-Queens II

Follow up for N-Queens problem.

Now, instead outputting board configurations, return the total number of distinct solutions.

?

?

1 class Solution 2 { 3 private: 4 // 試探算法從最右邊的列開始。 5 void test(long row, long ld, long rd) 6 { 7 if (row != upperlim) 8 { 9 // row,ld,rd進行“或”運算,求得所有可以放置皇后的列,對應位為0, 10 // 然后再取反后“與”上全1的數,來求得當前所有可以放置皇后的位置,對應列改為1。 11 // 也就是求取當前哪些列可以放置皇后。 12 long pos = upperlim & ~(row | ld | rd); 13 while (pos) // 0 -- 皇后沒有地方可放,回溯。 14 { 15 // 拷貝pos最右邊為1的bit,其余bit置0。 16 // 也就是取得可以放皇后的最右邊的列。 17 long p = pos & -pos; 18 19 // 將pos最右邊為1的bit清零。 20 // 也就是為獲取下一次的最右可用列使用做準備, 21 // 程序將來會回溯到這個位置繼續試探。 22 pos -= p; 23 24 // row + p,將當前列置1,表示記錄這次皇后放置的列。 25 // (ld + p) << 1,標記當前皇后左邊相鄰的列不允許下一個皇后放置。 26 // (ld + p) >> 1,標記當前皇后右邊相鄰的列不允許下一個皇后放置。 27 // 此處的移位操作實際上是記錄對角線上的限制,只是因為問題都化歸 28 // 到一行網格上來解決,所以表示為列的限制就可以了。顯然,隨著移位 29 // 在每次選擇列之前進行,原來N×N網格中某個已放置的皇后針對其對角線 30 // 上產生的限制都被記錄下來了。 31 test(row | p, (ld | p) << 1, (rd | p) >> 1); 32 } 33 } 34 else 35 { 36 // row的所有位都為1,即找到了一個成功的布局,回溯。 37 sum++; 38 } 39 } 40 41 public: 42 int totalNQueens(int n) 43 { 44 upperlim = 1; 45 sum = 0; 46 47 upperlim = (upperlim << n) - 1; 48 test(0, 0, 0); 49 50 return sum; 51 } 52 private: 53 int upperlim; 54 int sum; 55 };

?

轉載于:https://www.cnblogs.com/lxd2502/p/4378103.html

總結

以上是生活随笔為你收集整理的[leetcode] N-Queens II的全部內容,希望文章能夠幫你解決所遇到的問題。

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