51 N 皇后(回溯演算法)

2021-10-19 11:35:39 字數 1610 閱讀 8388

n 皇后問題 研究的是如何將 n 個皇后放置在 n×n 的棋盤上,並且使皇后彼此之間不能相互攻擊。

給你乙個整數 n ,返回所有不同的 n 皇后問題 的解決方案。

每一種解法包含乙個不同的 n 皇后問題 的棋子放置方案,該方案中 『q』 和 『.』 分別代表了皇后和空位。

我們先來簡化一下題目:棋盤中皇后可以攻擊同一行、同一列,或者左上、左下、右上、右下四個方向的任意單位。現在給你乙個nxn的棋盤,讓你放置n個皇后,使得它們不能互相攻擊,返所有合法的結果。

這題只需要套回溯演算法的模板即可。

class

solution

backtrack

(board,0)

;return res;}/*

路徑:borad中小於row的哪些行都已經被放置了皇后,就相當於已經被選擇過的列表

選擇列表:第row行中的所有列,都可以用來放置皇后

結束條件:row超過board的最後一行,證明棋盤滿了

*/public

void

backtrack

(char

board,

int row)

int columns = board[0]

.length;

for(

int col =

0; col < columns; col++

)//把選擇 加入到路徑

board[row]

[col]

='q'

;//進入下一行決策

backtrack

(board, row +1)

;//撤銷選擇

board[row]

[col]

='.';}

}public

boolean

isvalid

(char

board,

int row,

int col)

}//檢查右上方是否有皇后

for(

int i = row -

1, j = col +

1; i >=

0&& j < n; i--

, j++)}

//檢查左上方是否有皇后

for(

int i = row -

1, j = col -

1; i >=

0&& j >=

0; i--

, j--)}

//我們不用檢測當前行、列以下的棋盤,因為是從上往下開始填的

return

true

;//沒有衝突

}/**

* 用來做型別轉換

** @param board

* @return

*/public list

turn

(char

board)

target.

add(sb.

tostring()

);}return target;

}}

回溯 51 N皇后

思路 皇后彼此不能相互攻擊,也就是說 任何兩個皇后都不能處於同一條橫行 縱行或斜線上,所以固定行進行遞迴,借助輔助資料結構保證列 斜線上不同即可。其中正斜線的座標差相同,反斜線的座標和相等,通過查詢集合裡面是否有值保證其不同。class solution void backtrack vector ...

回溯法 力扣51 N 皇后

開闢兩個二陣列queen和attack。queen表示棋盤,queen i j q 則表示當前位置放置皇后,如果queen i j 表示未放置皇后。attack表示皇后攻擊範圍,attack i j 1表示當前位置在皇后攻擊範圍內,attack i j 0表示當前位置不在皇后攻擊範圍內。從第一行開始...

Leetcode刷題筆記 51 N 皇后

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