LeetCode-N皇后

                                      LeetCode-N皇后

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

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

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

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

示例:

  1. 输入: 4
  2. 输出: [
  3. [".Q..", // 解法 1
  4. "...Q",
  5. "Q...",
  6. "..Q."],
  7. ["..Q.", // 解法 2
  8. "Q...",
  9. "...Q",
  10. ".Q.."]
  11. ]
  12. 解释: 4 皇后问题存在两个不同的解法。

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

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

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

  1. class Solution(object):
  2. def solveNQueens(self, n):
  3. """
  4. :type n: int
  5. :rtype: List[List[str]]
  6. """
  7. if n <= 0:
  8. return []
  9. if n == 1:
  10. return [["Q"]]
  11. res = []
  12. pos = [-1]*n
  13. row = 0#从0行开始
  14. self.NQueens(row, n, pos, res)
  15. return res
  16. def NQueens(self, row, n, pos, res):
  17. #放置第row行的皇后
  18. if row == n:
  19. item=[]
  20. for i in range(n):#行
  21. tmp = ""
  22. for j in range(n):#列
  23. if pos[i] == j:#存的列一致
  24. tmp += "Q"
  25. else:
  26. tmp += "."
  27. item.append(tmp)
  28. print(pos,item)
  29. res.append(item)
  30. else:
  31. for col in range(n):
  32. if self.isValid(pos, row, col):
  33. pos[row] = col#存列
  34. self.NQueens(row+1, n, pos, res)
  35. pos[row] = -1
  36. def isValid(self, pos, row, col):
  37. for i in range(row):
  38. #检查当前行和前面行是否冲突即可。
  39. #检查是否同列很简单,检查对角线就是行的差和列的差的绝对值不要相等就可以
  40. if col == pos[i] or abs(row-i) == abs(col-pos[i]):
  41. return False
  42. return True

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

阅读更多
posted @ 2018-10-12 16:23  AcceptedLin  阅读(105)  评论(0编辑  收藏  举报