1. 题目

【LeetCode】八皇后_leetcode

2.

深搜判断并求解

3. 代码

from typing import List
from copy import deepcopy
class Solution:
def solveNQueens(self, n: int) -> List[List[str]]:
res = []
tmp = []
for i in range(n):
tmp.append([0,i])
self.dfs(0,i,n,res,tmp) # 从第(0,i) 这个位置开始放
tmp.pop()
# print(res)
return self.get_res(res,n)
#
def get_res(self,res,n):
out = []
for i in range(len(res)):
tmp = [['.'] * n for i in range(n) ]
for j in range(len(res[i])):
x,y = res[i][j]
tmp[x][y] = 'Q'
out.append(deepcopy(tmp))
# print(out)

out_2 = []
for i in range(len(out)):
tmp = []
for j in range(len(out[i])):
tmp.append("".join(out[i][j]))

out_2.append(deepcopy(tmp))
return out_2

# 判断两个坐标是否是对角线
def judge(self,x1,y1,x2,y2):
if abs(x1-x2) == abs(y1-y2) or y1 == y2:
return True

return False

# 分配位置
def dfs(self,x,y,n,res,tmp):
if x == n-1: # 说明已经分配完了
res.append(deepcopy(tmp))
return

for i in range(n):#列的位置
# 开始放置新的位置
# 在摆放之前,先确认是否符合条件
j = 0
while(j < len(tmp)):
pre_x,pre_y = tmp[j]
if self.judge(pre_x,pre_y,x+1,i): #说明不符合条件
break
j+=1
if j == len(tmp): # 说明符合条件
tmp.append([x+1,i])
self.dfs(x+1,i,n,res,tmp)
tmp.pop()