LeetCode-N皇后

                                      LeetCode-N皇后

皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

上图为 8 皇后问题的一种解法。

给定一个整数 n,返回所有不同的 皇后问题的解决方案。

每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

示例:

输入: 4
输出: [
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],
["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。

经典的N皇后问题,经典解法为回溯递归,一层一层的向下扫描,需要用到一个pos数组,其中pos[i]表示第i行皇后的位置,初始化为-1,然后从第0开始递归,每一行都一次遍历各列,判断如果在该位置放置皇后会不会有冲突(

  • 判断列是否冲突,只需要看state数组中state[0…k-1] 是否有和state[k]相等;
  • 判断对角线是否冲突:如果两个皇后在同一对角线,那么|row1-row2| = |column1 - column2|,(row1,column1),(row2,column2)分别为冲突的两个皇后的位置

),以此类推,当到最后一行的皇后放好后,一种解法就生成了,将其存入结果res中,然后再还会继续完成搜索所有的情况,代码如下:

class Solution(object):
def solveNQueens(self, n):
"""
:type n: int
:rtype: List[List[str]]
"""
if n <= 0:
return []
if n == 1:
return [["Q"]]
res = []
pos = [-1]*n
row = 0#从0行开始
self.NQueens(row, n, pos, res)
return res
def NQueens(self, row, n, pos, res):
#放置第row行的皇后
if row == n:
item=[]
for i in range(n):#行
tmp = ""
for j in range(n):#列
if pos[i] == j:#存的列一致
tmp += "Q"
else:
tmp += "."
item.append(tmp)
print(pos,item)
res.append(item)
else:
for col in range(n):
if self.isValid(pos, row, col):
pos[row] = col#存列
self.NQueens(row+1, n, pos, res)
pos[row] = -1
def isValid(self, pos, row, col):
for i in range(row):
#检查当前行和前面行是否冲突即可。
#检查是否同列很简单,检查对角线就是行的差和列的差的绝对值不要相等就可以
if col == pos[i] or abs(row-i) == abs(col-pos[i]):
return False
return True

非递归解法见:http://www.cnblogs.com/TenosDoIt/p/3801621.html

阅读更多

转载于:https://www.cnblogs.com/AcceptedLin/p/9778853.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值