力扣刷題 N皇后問題和島嶼的最大面積 DFS

2021-10-04 15:00:28 字數 1813 閱讀 7643

對dfs而言,必然是需要標記陣列的,也就是當前單位是否被遍歷過,否則dfs將不會停止。但有乙個非常特別的不同,就是當前單位是否被遍歷過是對於下層單位來說的,還是對於全域性來說的,這將取決於題目的性質,也決定了標記陣列不同的使用方法,下面將通過舉兩個例子來說明這個點。

很明顯的一道回溯的題目,這裡我們假設已經放了k-1個皇后,對於第k個的放置,應該在第k+1行(因為陣列自0開始計數),通過遍歷第k+1行,如果有滿足條件的,我們就將第k個皇后放上去,重複這個過程,直到放置完成,將這個放置方案輸出。

後面是重點:我們如何去儲存皇后放置的位置,這也決定了是否具有標記的必要:

2.2 第一種儲存方案

我們將定義乙個map[n][n]的陣列,對於放置皇后的位置賦值為1,傳進來行列i,j先判斷當前是否滿足條件,如果滿足就賦值為1,傳入i+1,0繼續進行上述過程,不滿足我們將i,j+1傳入。

如果對於某一行,任何一列都不能滿足要求,這就說明前面的放置出現問題,而前面的放置已經導致map的值發生改變,這個時候對於這一行來說,便不能夠具有「糾錯」的功能了,所以這裡我們將使用這樣的語句:

if

(ij條件滿足)

{ map[i]

[j]=1;

//(2)

傳入(i+1,

0);//(3)

map[i]

[j]=0;

//(4)

由此當(3)沒有滿足條件的時候(或者全部執行結束的時候),(4)語句將會執行,將放置到這個位置的皇后拿走,為後面的遍歷做準備,這時的(2)語句更多地是為了對從屬它的搜尋進行限制,而不對同一層的搜尋進行限制。(如果沒有(4),第i行只能將皇后放在這個位置而不能改變了,從而也就不能得出所有的解)

2.3 第二種儲存方案

**如下:

private

void

check

(int n)

//依次放入皇后,並判斷是否衝突

for(

int i=

0;iprivate

boolean

judge

(int n)

return

true

;}

其中arr[n]=i表示第n+1個皇后放在了第i列,第n+1行。而因為遍歷和皇后問題的關係,並不需要標識,因為使用了遍歷的方法,對於每一行來說,皇后只能有乙個,這樣對於同一行元素沒有必要甄別,也就沒必要標識了。

對於這個問題,我們使用如下的方法:

public

intdfs

(int i,

int j,

int[

] grid,

int[

] flag)

;int dl=

;if(i>=

0&&i=

0&&j

.length&&flag[i]

[j]==

0&&grid[i]

[j]==1)

return ans;

}else

return0;

}

這裡如果我們使用(7)(8)而不是(6)的話,這會導致標識陣列對於全域性沒有影響力,而對於這道題,將會導致某些單位被重複計數,儘管在連貫的搜尋中其不會出現重複計數。我們將用乙個圖來表示:

歡迎來我的部落格看看

領扣刷題 N皇后問題

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

島嶼的最大面積 力扣第695題

題目 給定乙個包含了一些 0 和 1 的非空二維陣列 grid 乙個 島嶼 是由一些相鄰的 1 代表土地 構成的組合,這裡的 相鄰 要求兩個 1 必須在水平或者豎直方向上相鄰。你可以假設 grid 的四個邊緣都被 0 代表水 包圍著。找到給定的二維陣列中最大的島嶼面積。如果沒有島嶼,則返回面積為 0...

力扣的刷題之旅

724.尋找陣列的中心索引 給定乙個整數型別的陣列 nums,請編寫乙個能夠返回陣列 中心索引 的方法。我們是這樣定義陣列中心索引的 陣列中心索引的左側所有元素相加的和等於右側所有元素相加的和。如果陣列不存在中心索引,那麼我們應該返回 1。如果陣列有多個中心索引,那麼我們應該返回最靠近左邊的那乙個。...