n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
示例:
输入: 4
输出: [
[".Q…", // 解法 1
“…Q”,
“Q…”,
“…Q.”],
["…Q.", // 解法 2
“Q…”,
“…Q”,
“.Q…”]
]
解释: 4 皇后问题存在两个不同的解法。
第一次的代码:
既然是经典的算法问题,就好好的思考了一下算法。
每一行只能放一个皇后,那么只需要知道每一行皇后的x列坐标即可,那么先给定一个判断是否可行的函数,接下来,我采用一个列表来储存一个棋盘可行的皇后在每一行的列坐标,列表里每一个列坐标在这个列表中的位置,就是皇后的行坐标(因为存储皇后的顺序是从第一行(位置0行)开始的),最后用一个函数,将这些列坐标的位置依次放上Q
def buchongtu(xu,nextx): #定义一个不冲突函数
nexty=len(xu) #y坐标就是列表xu的长度,即要放皇后的新的那一行
#因为第一个皇后的行的第0行
k=0 #判断与第k行皇后是否冲突
for i in xu:
if i+k==nextx+nexty: #第一种情况,这里的k表示以存在的皇后
#的行坐标y
return False
elif i-k==nextx-nexty: #第二种情况
return False
elif i==nextx: #第三种情况
return False
k+=1
return True #都不冲突,返回True
def queen(xulie,n,ans):
if len(xulie)==n: #当储存满一个棋盘的时候
ans.append(xulie) #将此棋盘加入列表ans中
else: #如果还可以加皇后
for i in range(n): #那么从新的一行开始,每一个位置
#都尝试放皇后
if buchongtu(xulie,i): #如果这个位置不冲突
queen(xulie+[i],n,ans) #表明可以将这个位置(列坐标)
#加入列表中,继续递归
def daying(xulie,n): #定义一个函数,把皇后的坐标变成棋盘
a=[]
for j in xulie: #对棋盘中的每一个皇后坐标
c=''
i=0 #第i行
while i <n:
if i==j: #在得到的坐标位置放Q
c+='Q'
else: #不在坐标位置的,放 点
c+='.'
i+=1
a.append(c) #得到棋盘
return a
aa=[]
queen([],n,aa)
ans1=[]
for i in aa: #可能存在多个棋盘
aaa=daying(i,n) #将多个棋盘储存在列表中
ans1.append(aaa)
return ans1
92ms,排名68%