其实我也没觉得多快233333333
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
int uplimit,sum=0,x=0,n;
int a[20];
queue <int> que;
void print()//输出函数
{
for(int i=1;i<=n;i++)
{
int tmp=a[i],cnt=0;
while(tmp!=0)
{
cnt++;
tmp=tmp>>1;//除几个2成为0即为行数
}
printf("%d ",cnt);
}
printf("\n");
}
void dfs(int i,int ld,int rd)//i表示每列的状态,ld表示左对角线的状态,rd表示右对角线的状态
{
if(i==uplimit)//全部找到
{
sum++;
if(sum<=3) print();
return;
}
else
{
int pos=uplimit&~(i|ld|rd);//用来找全部的方案
while(pos!=0)//枚举全部的方案
{
int p=pos&(~pos+1);//用来找最靠后的0
pos-=p;//减这个位置出去
x++;
a[x]=p;
dfs(i+p,(ld+p)<<1,(rd+p)>>1);
x--;
}
}
}
int main()
{
scanf("%d",&n);
uplimit=(1<<n)-1;//计算全部放满的状态
dfs(0,0,0);
printf("%d",sum);//输出方案数
}