n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击。
给定一个整数n,返回所有不同的n皇后问题的解决方案。
每个解决方案包含一个明确的n皇后放置布局,其中“Q”和“.”分别表示一个女王和一个空位置。
您在真实的面试中是否遇到过这个题? Yes
样例
对于4皇后问题存在两种解决的方案:
[
[“.Q..”, // Solution 1
“…Q”,
“Q…”,
“..Q.”],
[“..Q.”, // Solution 2
“Q…”,
“…Q”,
“.Q..”]
]
挑战
你能否不使用递归完成?
标签
Expand
相关题目
Expand
分析:非递归的话,那一般就是用栈来模拟递归。我们可以用栈来记录当前处理到第几排了,然后已处理的一些用一个数组保存起来
代码:
class Solution {
public:
/**
* Get all distinct N-Queen solutions
* @param n: The number of queens
* @return: All distinct solutions
* For example, A string '...Q' shows a queen on forth position
*/
vector<vector<string> > solveNQueens(int n) {
// write your code here
vector<int> queen(n,-1);
stack<int> st;
st.push(0);
vector<vector<string> > ret;
while(!st.empty())
{
int row = st.top();
queen[row]++;
if(queen[row]>=n)
st.pop();
else
{
if(verify(queen,row))
{
if(row==n-1)
{
vector<string> v;
for(int i=0;i<n;i++)
{
int x = queen[i];
string s = "";
for(int j=0;j<n;j++)
{
if(j==x)
s+='Q';
else
s+='.';
}
v.push_back(s);
}
ret.push_back(v);
}
else
{
queen[row+1]=-1;
st.push(row+1);
}
}
}
}
return ret;
}
bool verify(vector<int> queen,int row)
{
for(int i=0;i<=row;i++)
{
for(int j=0;j<i;j++)
if(queen[i]==queen[j]||(abs(queen[i]-queen[j])==i-j))
return false;
}
return true;
}
};