首页 > 代码库 > LeetCode51 N-Queens
LeetCode51 N-Queens
题目:
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. (Hard)
For example,
There exist two distinct solutions to the 4-queens puzzle:
[ [".Q..", // Solution 1 "...Q", "Q...", "..Q."], ["..Q.", // Solution 2 "Q...", "...Q", ".Q.."]]
分析:
n皇后问题,典型的搜索思路,对每一行,依次遍历选择一个位置,添加一个Q进去,判断是否合法。合法则处理下一行,不合法则回退到上一行选择其他位置添加Q。
注意isVaild函数的写法,行在添加过程中保证不重复,列需要判断,主副对角线通过x + y为定值和 x - y为定值判断(注意均只需要判断x,y之前的即添加过的部分)。
代码:
1 class Solution { 2 private: 3 vector<vector<string>> result; 4 void helper(vector<string>& v, int row, int n) { 5 for (int i = 0; i < n; ++i) { 6 v[row][i] = ‘Q‘; 7 if (isValid(v, row, i, n)) { 8 if (row == n - 1) { 9 result.push_back(v);10 v[row][i] = ‘.‘;11 return;12 }13 helper(v, row + 1, n);14 }15 v[row][i] = ‘.‘;16 }17 }18 bool isValid (const vector<string>& v, int x, int y, int n) {19 for (int i = 0; i < x; ++i) {20 if (v[i][y] == ‘Q‘) {21 return false;22 }23 }24 for(int i = x - 1, j = y - 1; i >= 0 && j >= 0; i--,j--) {25 if(v[i][j] == ‘Q‘) {26 return false;27 }28 }29 for(int i = x - 1, j = y + 1; i >= 0 && j < n; i--,j++){30 if(v[i][j] == ‘Q‘) {31 return false;32 }33 }34 return true;35 }36 public:37 vector<vector<string>> solveNQueens(int n) {38 vector<string> v(n, string(n, ‘.‘));39 helper(v,0,n);40 return result;41 }42 };
LeetCode51 N-Queens
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。