一个正常的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;
}