题意是给出 一个n *n 的棋盘,放置k个皇后,求出有多少种放置的情况?
dfs 搜索可做,要用到状态的压缩,把每一行的状态压成一个integer 类型的数。
从第一层向下搜索。
上一层 对下一层的影响有三种 : 竖直向下 、向左斜 、向右斜
在搜 r层时 用 row 表示 r 层以上 所有的皇后在竖直方向上对第r层的影响 1 表示在攻击范围内 0 表示不再攻击范围内
ld 表示 r 层以上 所有皇后在 左斜这个方向上 对这一层的影响 1表示攻击的到
rd 表示 r层以上 所有的皇后在右斜 方向上 对这一层的影响 1 表示攻击的到
搜索下层时 由于左斜的状态 要向左移一下 , 用位移操作即可 :ld <<1 rd 同理 rd>>1
代码如下:
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int n,k;
int sum =0;
int uplim ;
// rownum 表示行数 num表示 已经搜索到的皇后的 个数。。。。
void dfs(int row ,int ld,int rd ,int rownum,int num){
if(num ==k){
sum++;
return ;
}
//搜索深度限制
if(rownum==n){
return ;
}
int pos = uplim &(~(row|ld|rd));
// pos 的二进制 中的1 表示此位置 可以放置 皇后
while(pos){
// 依次在 没一个可以放置的位置上放置
int p = pos&(-pos);
pos -=p;
// 搜索下一层
dfs(row+p,(ld+p)<<1,(rd+p)>>1,rownum+1,num+1);
}
// 这一层不放置
dfs(row,ld<<1,rd>>1,rownum+1,num);
}
int main(){
cin>> n>> k;
if(k>n){
cout << 0<<endl;
return 0;
}
uplim =(1<<n)-1;
dfs(0,0,0,0,0);
cout<< sum <<endl;
return 0;
}
参考:http://www.matrix67.com/blog/archives/266