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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

52. N-Queens II N皇后II

發布時間:2025/7/14 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 52. N-Queens II N皇后II 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

網址:https://leetcode.com/problems/n-queens-ii/

方法1:按照邏輯思路,通過回溯法解決問題。速度較慢!

class Solution { public:void backTracking(vector<string> res, int &ans, int r, int n){bool legal = true; // 定義一個flag,用于判斷某一行中的某個位置是否合法if(r == n) // 表示已經遍歷完所有行 {ans++;return;}for(int j = 0; j<n; j++) // 判斷當前行中的每個位置 {legal = true;for(int i = 0; i<=r-1; i++) // 判斷此位置是否合法 {// 分別判斷 列、副對角線、主對角線// j - (r-i)if((res[i][j] == 'Q') || (res[i][j+i-r] == 'Q') || (res[i][j+r-i] == 'Q')){// 說明此位置會被其他皇后攻擊legal = false;break;}}if(legal){// 在此位置放置一個皇后res[r][j] = 'Q';// 將新的數據再次進行回溯backTracking(res, ans, r+1, n);// 回溯完畢后切記恢復原來的狀態,以剩余的for循環res[r][j] = '.';}}}int totalNQueens(int n) {string s(n, '.');vector<string> vc(n, s);int ans = 0;backTracking(vc, ans, 0, n);return ans;} };

方法2:位運算

參考:https://www.bilibili.com/video/av46292575/?p=43

class Solution { public:void dfs(int &ans, int n, int row, int col, int pie, int na){if(row == n) // 表示已經遍歷完所有行 {ans++;return;}// 把int類型的col、pie、na以二進制來看待,0分別表示此格子不會被其他皇后以某種方式攻擊,1表示會// (col|pie|na)得到總的攻擊情況,但我們需要的是當中 0 的位置,因為0的位置無法獲取,所以// 對(col|pie|na)取反,即'~'操作符。取反后,數據的后n位是滿足我們的要求的// 但是,前面原來的0都變成了1,所以要想辦法把第n位之前的0還原為1// (1 << n)-1) 即可產生000...001111這樣一個數,將其&上原來的數,即可實現預想int bits = ((~(col|pie|na))&((1 << n)-1));while(bits) // {int pos = bits & -bits; // 得到一個只保留最后一位 1 ,其他的全為 0 的數// 更新數據,注意對角線的挪移dfs(ans, n, row+1, col|pos, (pie|pos)<<1, (na|pos)>>1);// 把bits去掉最后一位的 1bits = bits & (bits-1);}}int totalNQueens(int n) {int ans = 0;dfs(ans, n, 0, 0, 0, 0);return ans;} };

?

轉載于:https://www.cnblogs.com/tornado549/p/10701124.html

總結

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

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