n皇后(位运算版)

来源:互联网 发布:gnu与linux 编辑:程序博客网 时间:2024/06/06 09:42

其实我也没觉得多快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);//输出方案数}
1 0
原创粉丝点击