LeetCode51N皇后問題 回溯演算法

2021-10-10 09:22:11 字數 1107 閱讀 8190

最暴力的解法就是在棋盤上把所有的位置都遍歷一遍,並判斷當前位置能否放皇后……那麼此題就可以遞迴回溯演算法,用遞迴,首先就要確定遞迴的引數,

void getqueens(int n,int index,vector & row)

n代表皇后的個數,index表示當前考慮將皇后放到第index行,

row[i]=k,表示第i行的第k列放了皇后。

其次,此題的關鍵就是判斷當前位置能不能放皇后,這裡有一定的技巧性,我定義了以下向量來儲存

vector col,dia1,dia2;

**col[i]**表示第i列是否已經訪問過;

dia1表示左下到右上對角線是否被訪問過

其中左下到右上對角線上的點有乙個特點,就是橫座標加縱座標等於乙個常數,並且第一條對角線上的橫縱座標相加為0,於是我們用 dia1[index+i]來表示該點的第一類對角線是否被訪問過

dia2表示右上到左下對角線是否被訪問過

其中的特點就是,該對角線上的橫座標減縱座標為乙個常數,但是常數的最小值為n-1,所以為了使用方便,我們就用dia2[index-i+n-1]來表示該點的第二類對角線是否被訪問過;

**	其中對於dia1,dia2都有2*n-1條對角線**
class

solution

return temp;

}void

getqueens

(int n,

int index,vector <

int>

& row)

for(

int i=

0;i}public

: vector>

solvenqueens

(int n)

};

Leetcode 51 N皇后 回溯

題目 51 題意 求解n皇后問題的所有解 思路 回溯,對於每一行必須且只能放置乙個皇后,於是只需要考慮列即可。對於每一行,按列進行迴圈,檢查當前位置是否可以放置皇后,如果可以就把攻擊範圍的方格打上標記。如果row current row,意味著得到了乙個可能的方案,回溯尋找下乙個可能的方案,直到所有...

LeetCode51 N皇后 C語言

結局還是好的 第一次自己寫出這麼快的 怎麼判斷在同一行同一列以及對角線上有沒有別的皇后 我是把乙個皇后和一行繫結,按一次迴圈是找去下一行,也就是說每行的皇后肯定是不衝突的,不可能說有兩個皇后在一行的,所以只用判斷在列和對角線上是不是有別的皇后即可,我是維護了三個陣列分別是列標記陣列 n列一維陣列 如...

leetcode51 N皇后 dfs,全排列

n 皇后問題研究的是如何將 n 個皇后放置在 n n 的棋盤上,並且使皇后彼此之間不能相互攻擊。上圖為 8 皇后問題的一種解法。給定乙個整數 n,返回所有不同的 n 皇后問題的解決方案。每一種解法包含乙個明確的 n 皇后問題的棋子放置方案,該方案中 q 和 分別代表了皇后和空位。示例 輸入 4輸出 ...