题目:https://www.luogu.org/problemnew/show/P1219
详见:https://zepto.blog.luogu.org/solution-p1219
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <queue>
#include <deque>
#include <stack>
#define INF 0x3f3f3f3
using namespace std;
typedef long long LL;
const int maxn=1e5+5;
int N,vis[3][30],ans[30],cnt;
//vis[0][i]代表第i列是否有元素
//vis[1][line+i]代表行和列和为line+i的副斜线上是否有元素
//vis[2][line-i+N]代表行列之差为line-i(+N防止出现负数)的主斜线上是否有元素
void dfs(int line)
{
if(line>N)
{
if(++cnt>3)return ;
for(int i=1;i<N;i++)printf("%d ",ans[i]);
printf("%d\n",ans[N]);
}
for(int i=1;i<=N;i++)
{
if((!vis[0][i])&&(!vis[1][line+i])&&(!vis[2][line-i+N]))
{
ans[line]=i;
vis[0][i]=vis[1][line+i]=vis[2][line-i+N]=1;
dfs(line+1);
vis[0][i]=vis[1][line+i]=vis[2][line-i+N]=0;
}
}
}
int main()
{
scanf("%d",&N);
dfs(1);
printf("%d\n",cnt);
return 0;
}