zoukankan      html  css  js  c++  java
  • 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

    阅读更多
  • 相关阅读:
    tp5 window环境迁移到一键lnmp流程问题笔记
    构建:什么是构建
    requests--etree--xpath
    python-requests
    python正则表达式03--字符串中匹配数字
    python正则表达式02--findall()和search()方法区别,group()方法
    python正则表达式01--贪心算法和非贪心算法findall()
    UIViewController的生命周期(根视图view从无到有的过程)
    CoreData基础
    XMPP即时通信(基础)
  • 原文地址:https://www.cnblogs.com/AcceptedLin/p/9778853.html
Copyright © 2011-2022 走看看