https://www.acwing.com/problem/content/1434/
1~n数字的全排列,多了对角限制条件。
/式对角 行列和 相同
\式对角 行列差 相同,可能为负数,故加上n防止越界
#include<bits/stdc++.h>
using namespace std;
const int N=20;
bool st[N];//不同列
bool ts[N];//不同/式对角
bool ss[N+N];//不同\式对角
vector<int> ans;
int num;
int n;
void dfs(int u)
{
if(ans.size()==n){
num++;
if(num<=3){
for(auto x:ans)printf("%d ",x);
puts("");
}
return ;
}
else if(u>n)return;
for(int i=1;i<=n;i++)
{
if(!st[i]&&!ts[i+u]&&!ss[u-i+n]){
st[i]=true;
ts[i+u]=true;
ss[u-i+n]=true;
ans.push_back(i);
dfs(u+1);
ans.pop_back();
st[i]=false;
ts[i+u]=false;
ss[u-i+n]=false;
}
}
}
int main(){
cin>>n;
dfs(1);
cout<<num<<endl;
return 0;
}