N皇問題(判斷優化)

2021-10-12 10:23:03 字數 817 閱讀 6814

n皇后問題是乙個dfs問題,在乙個n*n的棋盤上放置n個皇后,每行乙個並使其不能互相攻擊(同一行、同一列、同一斜線上的皇后都會自動攻擊),問有多少種擺法。

對於n皇問題,回溯法我們很容易能夠想到,但是這樣的**提交到oj上時間複雜度肯定是無法通過的,那麼我們這裡就介紹一種優化,判斷優化。

如圖,行為x,列為y;

對於同一根藍色線上的矩陣元素,其行列相加(i+j)的值相同,對於同一根紅色線上的矩陣元素,其行-列(x-y)值相同,但是由於是減法所以會出現負數,為了避免這個問題我們可以選擇用n+i-j來表示紅色線。

接下來,用bool陣列來標記所有的對角線是否被某一皇后佔據,再用乙個陣列來表示第y列是否有元素。

我的**如下:

#include

using

namespace std;

bool lie[15]

,lf[30]

,ri[30]

;int vis[15]

,n,i,sum;

//第i個皇后(第i行),vis的值等於第幾列

bool

check

(int x,

int y)

void

dfs(

int x)

return;}

for(

int k=

1;k<=n;k++)}

return;}

intmain()

poj 1321(基礎BFS 類似N皇問題)

poj 1321 題解 在這裡我是用每次處理按行來處理的,這樣在以後的搜尋當中只需樣判斷是否同列就可以了 include include include include includeusing namespace std define rep i,a,b for int i a i b i int...

回溯法解決八皇問題

把八個皇后放在乙個8 8的棋盤上面,要求同一行 同一列 同一對角線不能有兩個皇后。思路 關鍵在於判定兩個皇后是否在同一行 同一列或同一對角線上。這裡,棋盤下標從1開始算起。觀察發現 若是在同一行,則行號相同 若在同一列,則列號相同 若在同一 對角線,則行列值之和相同 若是在同一 對角線,則行列值之差...

mysql優化之N 1問題

a物件關聯b物件,a物件進行列表展示時需顯示b物件的關聯屬性,這樣需要先用一條sql將n個a物件查詢出來,再用n條sql將這些物件的關聯屬性查詢出來。違背了減少資料庫互動原則,影響效能。千萬不要在for迴圈裡面進行sql查詢操作 就像下面我當初寫的破 trainclassvolist.foreach...