用位运算解决皇后问题以及皇后变体问题

问题描述:
N皇后问题或者如下皇后变体问题:
在一个6*6的棋盘里放置4个互不攻击的车的方案数为多少?(阿里2016实习生在线笔试题)
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;

int n,m,goal;
int ans,sum;

void DFS(int row,int ld,int rd,int sum,int now)
//
//每一次调用,都根据row,ld,rd计算出可行位置pos。然后遍历pos的所有位置。ld<<1,rd>>1表示下一行。row+p,表示第p行已被占用
// (ld+p)<<1,(rd+p)>>1表示第p行被占用后,在下一行对角线位置的冲突情况。
{
     if (now>n) return;
     if (sum<m)
     {                   int pos=goal&(~(row|ld|rd));//所有可行位置
                         //printf("%d %d %d %d\n",pos,row,ld,rd);
                         while (pos>0)//遍历该行所有的位置
                         {
                               int p=pos&(-pos);//p是某一个可以放置的位置 ,其实就是右边的位
                               pos-=p;
                               DFS(row+p,(ld+p)<<1,(rd+p)>>1,sum+1,now+1);
                         }
                         DFS(row,ld<<1,rd>>1,sum,now+1);//遍历下一行
     }
     else ++ans;
}

int main()
{
    scanf("%d%d",&n,&m);//n = 6,m = 4表示,在6×6棋盘上放置4个皇后
    goal=(1<<n)-1;//goal表示一行中所有的位置。
    //printf("%d\n",goal);
    DFS(0,0,0,0,0);
    printf("%d\n",ans);
    system("pause");
    return 0;
}

结果与分析:

详情见matrix67大牛的博客。

posted @ 2015-04-09 17:48  Qin&Yang  阅读(357)  评论(0编辑  收藏  举报