dfs:
在第u行内,检查第i列是否能够放置queen;
j表示u之前的行
同一列:i== res[j]
对角线:两点若为对角线则横坐标相减的绝对值=纵坐标相减的绝对值,故abs(res[j]-i)==abs(u-j)
代码:
#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
vector<int>res;
void dfs(int u)
{
if(u==n){
for(auto l:res)cout<<l;
cout<<endl;
return ;
}
for(int i=1;i<=n;i++) //在第u行检查第i列
{
int j;
for(j=0;j<u;++j) //j为u之前已经确定queen位置的行,其位置储存在res中
{
if((res[j]==i)||abs(res[j]-i)==abs(u-j))break; //同列,对角线
}
if(j==u){ //符合要求,在第u+1行继续检查
res[u]=i;
dfs(u+1);
}
}
}
int main(){
cin>>n;
res.resize(n);
dfs(0);
return 0;
}