題目
n 皇后問題研究的是如何將 n 個皇后放置在 n×n 的棋盤上,並且使皇后彼此之間不能相互攻擊。
上圖爲 8 皇后問題的一種解法。
給定一個整數 n,返回所有不同的 n 皇后問題的解決方案。
每一種解法包含一個明確的 n 皇后問題的棋子放置方案,該方案中 ‘Q’ 和 ‘.’ 分別代表了皇后和空位。
示例:
輸入: 4
輸出: [
[".Q…", // 解法 1
“…Q”,
“Q…”,
“…Q.”],
["…Q.", // 解法 2
“Q…”,
“…Q”,
“.Q…”]
]
解釋: 4 皇后問題存在兩個不同的解法。
思路
一行一行去做dfs index代表行號,從0開始
因爲不肯能在同一行放兩個皇后。
加三個標記數組:
如果這一行有皇后,就標記爲爲True,col[i]代表第i列有皇后
col = defaultdict(bool)
第一類對角線上有皇后,標記爲True
dia1 = defaultdict(bool)
# 第一類對角線行和列號相加總是爲常數
第二類對角線上有皇后,標記爲True
dia2 = defaultdict(bool)
# 第二類對角線行和列號相減總是爲常數
python代碼
from collections import defaultdict
import copy
class Solution(object):
def solveNQueens(self, n):
"""
:type n: int
:rtype: List[List[str]]
"""
if n <= 0:
return []
col = defaultdict(bool)
dia1 = defaultdict(bool)
dia2 = defaultdict(bool)
res = []
row = []
ans = []
def dfs(index):
if index == n:
res.append(copy.copy(row))
return
for i in range(n):
if not col[i] and not dia1[index + i] and not dia2[index-i]:
col[i] = True
dia1[index+i] = True # 第一類對角線行和列號相加總是爲常數
dia2[index-i] = True # 第二類對角線行和列號相減總是爲常數
row.append(i)
dfs(index+1)
col[i] = False
dia1[index+i] = False
dia2[index-i] = False
row.remove(i)
dfs(0)
print(res)
for k in range(len(res)):
graph = []
for i in range(n):
temp = ""
for j in range(n):
if j == res[k][i]:
temp += "Q"
else:
temp += "."
if j == n-1:
graph.append(temp)
ans.append(graph)
return ans