八皇后,一道非常经典的老题了
但是今天要用位运算优化,老实说一开始有点难理解
实际上现在也晕晕乎乎的,因为实在是位运算苦手……不难但是就是反应不过来,“诶这个符号是……啊啊想起来了!”“不对现在讲到哪了[惊]”“虽然知道了这个符号是干什么的……还是看不懂orz”
差不多是明白了要干什么,总之就是朝着不能放皇后的列标记标记标☆
洛谷上的题还要求输出方案,稍微折腾了一下
总之我讨厌位运算(╯>д<)╯┻━┻
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<string>
#include<queue>
#include<vector>
using namespace std;
int n,uplimit,ans,que[20],t;
void dfs(int m,int ld,int rd)
{
int i;
if(m!=uplimit)
{
int pos=uplimit&~(m|ld|rd);
while(pos!=0)
{
int v=0;
int p=pos&(~pos+1);
pos-=p;
int k=p;
while(k!=0)
{
k=k>>1;
v++;
}
t++;
que[t]=v;
dfs(m+p,(ld+p)<<1,(rd+p)>>1);
t--;
}
}
else
{
ans++;
if(ans<=3)
{
for(i=1;i<=t;i++)
printf("%d ",que[i]);
printf("\n");
}
return;
}
}
int main()
{
scanf("%d",&n);
uplimit=(1<<n)-1;
dfs(0,0,0);
printf("%d",ans);
return 0;
}