演算法 N皇后問題

2021-10-13 21:06:30 字數 1636 閱讀 4883

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

上圖為 8 皇后問題的一種解法。

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

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

示例:

輸入: 4

輸出: [

[".q..", // 解法 1

"...q",

"q...",

"..q."],

["..q.", // 解法 2

"q...",

"...q",

".q.."]

]解釋: 4 皇后問題存在兩個不同的解法。

//n皇后:找到所有的解法。橫著豎著兩個方向的斜著都不能有皇后

var solutions string

// n*n格的

func solvenqueens(n int) string

queens := make(int, n)

for i := 0; i < n; i++

//列columns := map[int]bool{}

diagonals1, diagonals2 := map[int]bool{}, map[int]bool{}

//回溯

backtrack(queens, n, 0, columns, diagonals1, diagonals2)

return solutions

}func backtrack(queens int, n, row int, columns, diagonals1, diagonals2 map[int]bool)

//一列一列進行操作,固定列然後判斷行

for i := 0; i < n; i++

diagonal1 := row - i

if diagonals1[diagonal1]

diagonal2 := row + i

if diagonals2[diagonal2]

queens[row] = i

columns[i] = true

diagonals1[diagonal1], diagonals2[diagonal2] = true, true

//回溯

backtrack(queens, n, row + 1, columns, diagonals1, diagonals2)

queens[row] = -1

delete(columns, i)

delete(diagonals1, diagonal1)

delete(diagonals2, diagonal2)

}}func generateboard(queens int, n int) string

for i := 0; i < n; i++

[queens[i]] = 'q'

}return board

}

演算法 n皇后問題

題目描述 乙個 n n 的棋盤,要在上面放 n 個皇后。規則 兩個皇后之間如果是同列 同行 同對角線它們會互相攻擊。也就 是 說 棋盤上的任意兩個皇后不能為同列 同行 同對角線。演算法思想 q j 表示乙個解的空間即儲存一組可行解的陣列,j表示行數,q j 的值表示j行可以放置皇后的所在列數,根據任...

(演算法)N皇后問題

八皇后問題 在8 x 8的西洋棋上擺放八個皇后,使其不能相互攻擊,即任意兩個皇后不得處於同一行,同一列或者同意對角線上,求出所有符合條件的擺法。1 回溯法 資料結構 由於8個皇后不能處在同一行,那麼肯定每個皇后佔據一行,這樣可以定義乙個陣列a 8 陣列中第i個數字,即a i 表示位於第i行的皇后的列...

演算法 n皇后問題

解題思路 這是一道非常經典的dfs問題,只需要從頭依次列舉各個情況即可。這樣設計dfs方式,先依次列舉每一行,在每一行中,再列舉當前行的每乙個元素,每次列舉完一行,就繼續向下一行列舉。根據題目規則,設計列舉過程的衝突陣列,防止皇后之間相互攻擊。而衝突陣列需要進行回溯。下面的 中,只有列 和兩個斜向衝...