[Leetcode] 51. N-Queens 解题报告
2017-01-11 14:49
330 查看
题目:
The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.
Given an integer n, return all distinct solutions to the n-queens puzzle.
Each solution contains a distinct board configuration of the n-queens' placement, where
indicate a queen and an empty space respectively.
For example,
There exist two distinct solutions to the 4-queens puzzle:
思路:
经典的“八皇后问题”简直就是为回溯法而生。为了提高运行效率,我们在DFS的内部实现了安全性检查:即在搜索进行到第k层的第i个位置时,我们检查它所在的列是否安全;所在的对角线是否安全,以及所在的反对角线是否安全。如果这三个地方都是安全的,则试图在该位置放置一个皇后,然后接着搜索下一层。搜索完成之后一定要回溯,才能保证找到所有满足条件的解。
代码:
The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.
Given an integer n, return all distinct solutions to the n-queens puzzle.
Each solution contains a distinct board configuration of the n-queens' placement, where
'Q'and
'.'both
indicate a queen and an empty space respectively.
For example,
There exist two distinct solutions to the 4-queens puzzle:
[ [".Q..", // Solution 1 "...Q", "Q...", "..Q."], ["..Q.", // Solution 2 "Q...", "...Q", ".Q.."] ]
思路:
经典的“八皇后问题”简直就是为回溯法而生。为了提高运行效率,我们在DFS的内部实现了安全性检查:即在搜索进行到第k层的第i个位置时,我们检查它所在的列是否安全;所在的对角线是否安全,以及所在的反对角线是否安全。如果这三个地方都是安全的,则试图在该位置放置一个皇后,然后接着搜索下一层。搜索完成之后一定要回溯,才能保证找到所有满足条件的解。
代码:
class Solution { public: vector<vector<string>> solveNQueens(int n) { vector<vector<string>> ret; if(n <= 0) return 4000 ret; vector<string> map(n, string(n, '.')); // initialize the chess DFS(map, ret, 0, n); return ret; } private: void DFS(vector<string>& map, vector<vector<string>> &ret, int k, int n) { if(n == k) return ret.push_back(map); for(int i = 0; i < n; ++i) { int x, y; for(y = 0; y < k; y++) if(map[y][i] == 'Q') // the y-th row is not safe break; if(y != k) continue; for(x = i, y = k; x < n && y >= 0; x++, y--) if(map[y][x] == 'Q') // the counter-diagonal is not safe break; if(!(x == n || y < 0)) continue; for(x = i, y = k;x >= 0 && y >= 0; x--, y--) if(map[y][x] == 'Q') // the diagonal is not safe break; if(!(x < 0 || y < 0)) continue; map[k][i] = 'Q'; DFS(map, ret, k + 1, n); map[k][i] = '.'; // backtracking } } };
相关文章推荐
- 【LeetCode】51.N-Queens(hard)解题报告
- N-Queens [Leetcode解题报告]
- leetCode 51.N-Queens (n皇后问题) 解题思路和方法
- LeetCode解题报告—— N-Queens && Edit Distance
- LeetCode: 【L4】N-Queens 解题报告
- [leetcdoe] 51. N-Queens 解题报告.
- leetcode解题笔记 51.N-Queens [Hard]
- 【LeetCode】 Happy Number 解题报告
- [Leetcode] 97. Interleaving String 解题报告
- [LeetCode] Implement strStr() 解题报告
- [Leetcode] 80. Remove Duplicates from Sorted Array II 解题报告
- [LeetCode] Longest Substring Without Repeating Characters 解题报告
- 【LeetCode】169. Majority Element(Easy)解题报告
- [LeetCode] Permutations II 解题报告
- [leetcode]215. Kth Largest Element in an Array@Java解题报告
- 【Leetcode】51. N-Queens(回溯)
- [LeetCode] Merge k Sorted Lists 解题报告
- [LeetCode] Rotate List 解题报告
- [LeetCode] Search in Rotated Sorted Array II 解题报告
- 【LeetCode】677. Map Sum Pairs 解题报告(Python)