52. N-Queens II N皇后II
生活随笔
收集整理的這篇文章主要介紹了
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android:手把手教你 实现Acti
- 下一篇: selenium中webdriver跳转