LeetCode51 N皇后 C語言

2021-09-29 16:21:11 字數 1995 閱讀 9827

結局還是好的(第一次自己寫出這麼快的**)

怎麼判斷在同一行同一列以及對角線上有沒有別的皇后

我是把乙個皇后和一行繫結,按一次迴圈是找去下一行,也就是說每行的皇后肯定是不衝突的,不可能說有兩個皇后在一行的,所以只用判斷在列和對角線上是不是有別的皇后即可,我是維護了三個陣列分別是列標記陣列(n列一維陣列)如果有皇后已經在該列,將col[j]改為1

主對角線陣列 在主對角線上行號-列號是乙個常數,

次對角線陣列 在次對角線上行號+列號是乙個常數

拿n=4來說

主對角線

行號-列號

列號0 1 2 3

行號0 0 1 2 3

1 -1 0 2 3

2 -2 -1 0 1

3 -3 -2 -1 0

可以標記某一條對角線的常數有-3 -2 -1 0 1 2 3 因為有負數我採用的辦法是將負數對映到正數後面 即-3-> 4 -3+(2*n-1)

次對角線

行號+列號

列號0 1 2 3

行號0 0 1 2 3

1 1 2 3 4

2 2 3 4 5

3 3 4 5 6

次對角線標記就是 0,1,2,3,4,5,6

如果有的話就不能放到這個位置

每次遞迴就是幫助乙個皇后尋找位置

比如第一次進到search代表的是幫助第一行的皇后找位置,因為一行有n列所以她有n個位置可以選,她從第乙個位置開始看起如果第乙個位置可以放,她就把自己放到這裡,然後通知下乙個皇后尋找自己的位置,也就是呼叫了一次search

**,將index(行號)+1。如果這個皇后看自己所有的位置都不可以放自己了,就通知自己的上一層皇后,「你的位置放的不對,我都沒地方放了」,這時上一層這個皇后就去找下乙個可以放自己的位置,當然在此之前要把自己剛剛佔的位置釋放掉

解釋完了,下面**就是按這個思路寫的應該挺容易理解了吧(哈哈)

有個需要注意的地方

0;i)//尋找第乙個列位置}}

char**

*solvenqueens

(int n,

int* returnsize,

int*

* returncolumnsizes)

search

(answer,returnsize,n,plate,col,firstdiagonal,seconddiagonal,0)

;*returncolumnsizes=

(int*)

malloc

(sizeof

(int)*

(*returnsize));

for(i =

0; i <

*returnsize; i++)(

*returncolumnsizes)

[i]= n;

return answer;

}

Leetcode 51 N皇后 回溯

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

leetcode51 N皇后 dfs,全排列

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

LeetCode51N皇后問題 回溯演算法

最暴力的解法就是在棋盤上把所有的位置都遍歷一遍,並判斷當前位置能否放皇后 那麼此題就可以遞迴回溯演算法,用遞迴,首先就要確定遞迴的引數,void getqueens int n,int index,vector row n代表皇后的個數,index表示當前考慮將皇后放到第index行,row i k...