n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
示例:
输入: 4
输出: [
[".Q…", // 解法 1
“…Q”,
“Q…”,
“…Q.”],
["…Q.", // 解法 2
“Q…”,
“…Q”,
“.Q…”]
]
解释: 4 皇后问题存在两个不同的解法。
解题思路:
典型DFS问题,分三个函数进行解,第一,判断两个皇后是否兼容,第二,dfs+第一个函数寻找皇后位置,第三输出格式的规范。
C++代码:
class Solution
{
public:
vector<vecvtor>solveNQueens(int n)
{
if(n<=0)return vector<vector>();
if(n1)return vector<vector>(1,‘Q’);
N=n;
Queens=vector(n,0);//初始化的N个皇后的位置都在每一行的第一个
dfs(0);
vectorMAP;
vector<vector>MAPs;
for(i=1;i<=res.size();i++)
{
for(j=1;j<=N;j++)
MAP.push_back(int2str(res[i-1][j-1],N));
MAPS.push_back(MAP);
MAP.clear();
}
return MAPs;
}
private:
int N;
vector<vector>res;
vectorQueens;
bool isOk(pair<int,int>a,pair<int,int>b)//判断位置是否重叠或者冲突
{
if(a.firstb.first)return false;
if(a.secondb.second)return false;
if(abs(a.first-b.first)abs(a.second-b.second))return false;
return true;
}
void dfs(int num)//深度优先搜索
{
int i,j;
pair<int,int>a,b;
if(num0)
{
for(int i=0;i<N;i++)
{
dfs(num+1);
Queens[num]++;//第num个皇后的位置,从1开始,++
}
}
if(num>0&&num<N-1)
{
for(int i=0;i<N;++i)
{
Queens[num]=i;
a.pair<int,int>(num,Queens[num]);
//判断第num个皇后与前面皇后的兼容问题
bool sgn=true;
for(j=0;j<num;j++)
{
b=pair<int,int>(j,Queens[j]);
if(!isOk(a,b)){sgn=false;break;}
}
if(sgntrue)dfs(num+1);
}
}
if(num==N-1)//到达最后一个皇后
{
for(i=0;i<N;++i)
{
Queens[num]i;
a=pair<int,int>(num,Queens[num]);
bool sgn=true;
for(j=0;j<num;j++)
{
b=pair<int,int>(j,Queens[j]);
if(!isOk(a,b)){sgn=false;break;}
}
if(sgntrue)
{
vectorroad;
for(j=0;j<=N;j++)
road.push_back(Queens[j-1]);
res.push_back(road);
}
}
}
return;
}
string int2str(int pos,int N)
{
return string(pos,’.’)+string(1,‘Q’)+string(N-(pos+1),’.’);
}
};