n皇后(位運算版)
阿新 • • 發佈:2019-01-07
其實我也沒覺得多快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);//輸出方案數
}