题目:设计一种算法,打印N皇后在N*N棋盘上的各种摆法,其中每个皇后都不同行。不同列、不同斜线。
提示:回溯算法。
#include <iostream>
#include <vector>
using namespace std;
void PrintQueen(vector<int> q)//打印一个解决方案
{
int len=q.size();
for(int i=0;i<len;i++)
{
int tmp=q[i];
for(int k=0;k<len;k++)
{
if(k==tmp)
cout<<"Q ";
else
cout<<"* ";
}
cout<<endl;
}
cout<<endl;;
}
bool IsRight(vector<int> &cur,int k)//判断第k行的皇后放置是否正确
{
for(int i=0;i<k;i++)
{
if(cur[i]==cur[k] || abs(cur[i]-cur[k])==k-i)
return false;
}
return true;
}
vector<vector<int>> NQueen(int n)
{
vector<vector<int>> res;
if(n<=0)
return res;
vector<int> cur(n);
int k=0;
cur[0]=-1;
while(k>=0)
{
cur[k]++;
while(cur[k]<n && !IsRight(cur,k))
cur[k]++;
if(cur[k]<n)
{
if(k<n-1) //判断当前行是不是最后一行,如果是最后一行则表明已经找到结果,打印结果
{
k=k+1;
cur[k]=-1;
}
else
{
res.push_back(cur);
cout<<"第"<<res.size()<<"种解决方案"<<":"<<endl;
PrintQueen(cur);
}
//printf(x[0:n-1]);
}
else
k--;
}
return res;
}