P1219 [USACO1.5] 八皇后 Checker Challenge
https://www.luogu.com.cn/problem/P1219

灵感来源于懒猫老师
每行每列写斜角线只有一个棋子,那么这道题的难点就是递归的时候如何标记已经搜到的行列对角线
看题目很明显是遍历行数,那么对于列数,b[i]=j,表示第i行第j列出现了皇后,那b[j]=1;
对角线分为两种,第一种是左下到右上,可以发现对角线上的i+j是相同的,所以可以记为c[i+j]=1
第二种是左上到右下,可以发现对角线上i-j是相同的,但是数组没有负数,所以记为d[i-j+n]=1


cpp
#include<bits/stdc++.h>
using namespace std;
int n,sum;
int a[100],b[100],c[100],d[100];
void dfs(int i){
if(i>n){
if(sum<=2){
for(int j=1;j<=n;j++){
cout<<a[j]<<" ";
}
cout<<endl;
}
sum++;
return;
}
else{
for(int j=1;j<=n;j++){
if(!b[j]&&!c[i+j]&&!d[i-j+n]){
a[i]=j;
b[j]=1;
c[i+j]=1;
d[i-j+n]=1;
dfs(i+1);
b[j]=0;
c[i+j]=0;
d[i-j+n]=0;
}
}
}
}
int main(){
cin>>n;
dfs(1);
cout<<sum<<endl;
return 0;
}
P10386 [蓝桥杯 2024 省 A] 五子棋对弈
https://www.luogu.com.cn/problem/P10386

这道题要求白棋13个,黑棋12个,且黑白棋分开下,所以两个递归
cpp
#include<bits/stdc++.h>
using namespace std;
int a[30],ans=0,w=0,b=0;
void dfs(int i){
if(i>25){
if(a[1]==a[2]&&a[1]==a[3]&&a[1]==a[4]&&a[1]==a[5])return;
if(a[6]==a[7]&&a[6]==a[8]&&a[6]==a[9]&&a[6]==a[10])return;
if(a[11]==a[12]&&a[11]==a[13]&&a[11]==a[14]&&a[11]==a[15])return;
if(a[16]==a[17]&&a[16]==a[18]&&a[16]==a[19]&&a[16]==a[20])return;
if(a[21]==a[22]&&a[21]==a[23]&&a[21]==a[24]&&a[21]==a[25])return;
if(a[1]==a[6]&&a[1]==a[11]&&a[1]==a[16]&&a[1]==a[21])return;
if(a[2]==a[7]&&a[2]==a[12]&&a[2]==a[17]&&a[2]==a[22])return;
if(a[3]==a[8]&&a[3]==a[13]&&a[3]==a[18]&&a[3]==a[23])return;
if(a[4]==a[9]&&a[4]==a[14]&&a[4]==a[19]&&a[4]==a[24])return;
if(a[5]==a[10]&&a[5]==a[15]&&a[5]==a[20]&&a[5]==a[25])return;
if(a[1]==a[7]&&a[1]==a[13]&&a[1]==a[19]&&a[1]==a[25])return;
if(a[5]==a[9]&&a[5]==a[13]&&a[5]==a[17]&&a[5]==a[21])return;
ans++;
return;
}
if(w<=12){
a[i]=1;
w++;
dfs(i+1);
w--;
}
if(b<=11){
a[i]=0;
b++;
dfs(i+1);
b--;
}
}
int main(){
dfs(1);
cout<<ans;
return 0;
}