您的位置:首页 > 其它

n皇后问题

2019-03-24 09:26 120 查看

一道很典型的递归题目,来自Leetcode第51题

国际象棋里皇后可以攻击到横向和竖向以及斜线方向的对手。
现在给定一个n*n的棋盘,n个皇后,问如何摆放这n个皇后,使得所有皇后都攻击不到其他人?
题目要求输入输出格式如下:
Input: 4
Output: [
[".Q…", // Solution 1
“…Q”,
“Q…”,
“…Q.”],

["…Q.", // Solution 2
“Q…”,
“…Q”,
“.Q…”]
]

此题用有个用python代码简单易懂的方法。代码如下:

class Solution:
def solveNQueens(self, n):
def DFS(queens, xy_dif, xy_sum):
p = len(queens) # p 是行的下标
if p == n: # 当所有行都执行完了,意味着满足了所有条件,可以存储到result里等待输出。
result.append(queens)
return None
for q in range(n): # q 是列的下标,每一行(p)都会尽可能遍历所有列,找到所有满足条件的列的位置
# queens用来存储已经选择的列,比如,[0,2,4,1]意思是0、2、4、1这几个列已经被用掉了
# xy_dif 是存储这样的斜对角 \ (从左上到右下)的线  因为所有的这样的斜对角的x,y之差都相同
# xy_sum 是存储这样的斜对角 / (从右上到左下)的线  因为所有的这样的斜对角的x,y之和都相同
if q not in queens and p - q not in xy_dif and p + q not in xy_sum:
DFS(queens + [q], xy_dif + [p - q], xy_sum + [p + q])

result = []
DFS([], [], [])
return [["." * i + "Q" + "." * (n - i - 1) for i in sol] for sol in result]

博主也参考了C++和JAVA的代码,发现这个很容易理解,没有太多的函数跳转

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: