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的代码,发现这个很容易理解,没有太多的函数跳转
相关文章推荐
- 【第六周 项目6-求解8皇后问题的程序】
- leetcode N-Queens I & II N皇后问题
- Codevs 1295 N皇后问题
- 基础练习 2n皇后问题
- 回溯法求解 “n 皇后 问题”——Java 实现
- 51/52 N-Queens(N皇后问题)
- java分治算法实现n皇后问题
- N皇后问题 HDU - 2553
- n皇后问题思考
- 九度 1254:N皇后问题
- HDU 2553 N皇后问题 dfs回溯+打表
- N皇后问题 (HDU2553)(A)
- 1019 N皇后问题
- 回溯法特点分析以及经典N皇后问题
- HDU-2553-N皇后问题
- hdu2553 N皇后问题
- 回溯算法 8皇后问题的一种解法 适合初学者观察整个回溯的过程
- hdu 2553 n皇后问题
- [ACM] hdu 2553 N皇后问题
- HDOJ2553(2N皇后问题)