leetcode_51. N 皇后

举报
悲恋花丶无心之人 发表于 2021/02/02 23:44:01 2021/02/02
【摘要】 目录 一、题目内容 二、解题思路 三、代码 一、题目内容 n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。 上图为 8 皇后问题的一种解法。 给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。 每一种解法包含一个明确的 n 皇后问题的棋子放置...

目录

一、题目内容

二、解题思路

三、代码


一、题目内容

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

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

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

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

示例:

输入:4
输出:[
 [".Q..",  // 解法 1
  "...Q",
  "Q...",
  "..Q."],

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

提示:

皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上

二、解题思路

DFS+回溯,逐行检查皇后位置(横行、纵行或斜线

三、代码


  
  1. class Solution:
  2. def solveNQueens(self, n: int):
  3. res = []
  4. path = [['.' for _ in range(n)] for _ in range(n)]
  5. def print_path():
  6. for i in range(n):
  7. print(path[i])
  8. print('\n')
  9. def change_style(path):
  10. new_path = []
  11. for i in range(n):
  12. cow_path = ''
  13. for j in range(n):
  14. cow_path += path[i][j]
  15. new_path.append(cow_path)
  16. return new_path
  17. def isValid(r, c):
  18. for i in range(1, r + 1):
  19. if path[r - i][c] == 'Q':
  20. return False
  21. if c - i >= 0 and path[r - i][c - i] == 'Q':
  22. return False
  23. if c + i < n and path[r - i][c + i] == 'Q':
  24. return False
  25. return True
  26. def dfs(pos: int):
  27. if pos == n:
  28. change_style_path = change_style(path)
  29. res.append(change_style_path)
  30. return
  31. for i in range(n):
  32. if isValid(pos, i):
  33. path[pos][i] = 'Q'
  34. # print_path()
  35. dfs(pos + 1)
  36. path[pos][i] = '.'
  37. # print_path()
  38. dfs(0)
  39. return res
  40. if __name__ == '__main__':
  41. n = 4
  42. ans_org = [['.', 'Q', '.', '.'],
  43. ['.', '.', '.', 'Q'],
  44. ['Q', '.', '.', '.'],
  45. ['.', '.', 'Q', '.']]
  46. s = Solution()
  47. ans = s.solveNQueens(n)
  48. print(ans)

文章来源: nickhuang1996.blog.csdn.net,作者:悲恋花丶无心之人,版权归原作者所有,如需转载,请联系作者。

原文链接:nickhuang1996.blog.csdn.net/article/details/108377958

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。