一个正常的dfs(数据范围1-13),发现一条对角线上,分别符合和与差相等。因为有负数,这里我最开始开的是map,发现卡了最后一个点TLE,记录一下时间复杂度(
map,set的时间复杂度:logN
传送门https://www.luogu.com.cn/problem/P1219
// Problem:
// P1219 [USACO1.5] 八皇后 Checker Challenge
//
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1219
// Memory Limit: 125 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include<iostream>
#include<map>
using namespace std;
int pluss[105];
int sub[105];
int n;
int a[15];//记录列
int k=0;
bool line[15];
#define endl '\n'
void print(){
for(int i=1;i<=n;++i) cout<<a[i]<<' ';
cout<<endl;
}
void dfs(int x){//第n行
if(x==n){
if(++k<=3) print();
return;
}
for(int i=1;i<=n;++i){
if(pluss[i+x+1]==0&&sub[i-x-1+n]==0&&!line[i]){
line[i]=true;
pluss[(i+x+1)]++;sub[i-x-1+n]++;
a[x+1]=i;
dfs(x+1);
line[i]=false;//每一列查询有没有
pluss[(i+x+1)]--;sub[i-x-1+n]--;
}
}
}
int main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n;
dfs(0);
cout<<k<<endl;
return 0;
}