1. 程式人生 > >n皇后(位運算版)

n皇后(位運算版)

其實我也沒覺得多快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);//輸出方案數 }