八皇后位运算版

n皇后问题位运算版

n皇后问题是啥我就不说了吧,学编程的肯定都见过。下面的十多行代码是n皇后问题的一个高效位运算程序,看到过的人都夸它牛。初始时,upperlim:=(1 shl n)-1。主程序调用test(0,0,0)后sum的值就是n皇后总的解数。拿这个去交USACO,0.3s,暴爽。

procedure test(row,ld,rd:longint);

var

pos,p:longint;

begin

{ 1} if rowupperlim then

{ 2} begin

{ 3} pos:=upperlim and not (row or ld or rd);

{ 4} while pos0 do

{ 5} begin

{ 6} p:=pos and -pos;

{ 7} pos:=pos-p;

{ 8} test(row+p,(ld+p)shl 1,(rd+p)shr 1);

{ 9} end;

{10} end

{11} else inc(sum);

end;

乍一看似乎完全摸不着头脑,实际上整个程序是非常容易理解的。这里还是建议大家自己单步运行一探究竟,实在没研究出来再看下面的解说。

和普通算法一样,这是一个递归过程,程序一行一行地寻找可以放皇后的地方。过程带三个参数,row、ld和rd,分别表示在纵列和两个对角线方向的限制条件下这一行的哪些地方不能放。我们以6x6的棋盘为例,看看程序是怎么工作的。假设现在已经递归到第四层,前三层放的子已经标在左图上了。红色、蓝色和绿色的线分别表示三个方向上有冲突的位置,位于该行上的冲突位置就用row、ld和rd中的1来表示。把它们三个并起来,得到该行所有的禁位,取反后就得到所有可以放的位置(用pos来表示)。前面说过-a相当于not a + 1,这里的代码第6行就相当于pos and (not pos + 1),其结果是取出最右边的那个1。这样,p就表示该行的某个可以放子的位置,把它从pos中移除并递归调用test过程。注意递归调用时三个参数的变化,每个参数都加上了一个禁位,但两个对角线方向的禁位对下一行的影响需要平移一位。最后,如果递归到某个时候发现row=111111了,说明六个皇后全放进去了,此时程序从第1行跳到第11行,找到的解的个数加一。

int n,m,k,mask;

LL ans;

void dfs(int row,int left,int right,int index,int c)

{

int pos,p;

if(c==k) ans++;

else

{

if(index

{

if(c+n-index>=k) dfs(row,(left>>1),(right

while(pos)

{

p=pos&(-pos);

pos=pos-p;

dfs(row+p,(left+p)>>1,(right+p)

}

}

}

int main()

{

// freopen("in.txt","r",stdin);

int i,j,t,T,x,y,sum,index;

cin>>n>>k;

if(k>n) {puts("0");return 0;}

mask=(1

dfs(0,0,0,1,0);

cout

return 0;

}

n皇后问题位运算版

n皇后问题是啥我就不说了吧,学编程的肯定都见过。下面的十多行代码是n皇后问题的一个高效位运算程序,看到过的人都夸它牛。初始时,upperlim:=(1 shl n)-1。主程序调用test(0,0,0)后sum的值就是n皇后总的解数。拿这个去交USACO,0.3s,暴爽。

procedure test(row,ld,rd:longint);

var

pos,p:longint;

begin

{ 1} if rowupperlim then

{ 2} begin

{ 3} pos:=upperlim and not (row or ld or rd);

{ 4} while pos0 do

{ 5} begin

{ 6} p:=pos and -pos;

{ 7} pos:=pos-p;

{ 8} test(row+p,(ld+p)shl 1,(rd+p)shr 1);

{ 9} end;

{10} end

{11} else inc(sum);

end;

乍一看似乎完全摸不着头脑,实际上整个程序是非常容易理解的。这里还是建议大家自己单步运行一探究竟,实在没研究出来再看下面的解说。

和普通算法一样,这是一个递归过程,程序一行一行地寻找可以放皇后的地方。过程带三个参数,row、ld和rd,分别表示在纵列和两个对角线方向的限制条件下这一行的哪些地方不能放。我们以6x6的棋盘为例,看看程序是怎么工作的。假设现在已经递归到第四层,前三层放的子已经标在左图上了。红色、蓝色和绿色的线分别表示三个方向上有冲突的位置,位于该行上的冲突位置就用row、ld和rd中的1来表示。把它们三个并起来,得到该行所有的禁位,取反后就得到所有可以放的位置(用pos来表示)。前面说过-a相当于not a + 1,这里的代码第6行就相当于pos and (not pos + 1),其结果是取出最右边的那个1。这样,p就表示该行的某个可以放子的位置,把它从pos中移除并递归调用test过程。注意递归调用时三个参数的变化,每个参数都加上了一个禁位,但两个对角线方向的禁位对下一行的影响需要平移一位。最后,如果递归到某个时候发现row=111111了,说明六个皇后全放进去了,此时程序从第1行跳到第11行,找到的解的个数加一。

int n,m,k,mask;

LL ans;

void dfs(int row,int left,int right,int index,int c)

{

int pos,p;

if(c==k) ans++;

else

{

if(index

{

if(c+n-index>=k) dfs(row,(left>>1),(right

while(pos)

{

p=pos&(-pos);

pos=pos-p;

dfs(row+p,(left+p)>>1,(right+p)

}

}

}

int main()

{

// freopen("in.txt","r",stdin);

int i,j,t,T,x,y,sum,index;

cin>>n>>k;

if(k>n) {puts("0");return 0;}

mask=(1

dfs(0,0,0,1,0);

cout

return 0;

}


相关文章

  • 中考数学规律复习题(整理全-含答案)
  • 规律探索1 一.选择题 1.观察下列等式:31=3,32=9,33=27,34=81,35=243,36=729,37=2187- 解答下列问题:3+32+33+34-+32013的末位数字是( ) A .0 B .1 C .3 D .7 ...查看


  • 汉字手抄报:经典字谜集锦
  • 1.楞.(打一字) --噪 谜面用偏旁连系组合法.将"楞"字,拆分为"四"."方"."木"三体.意谓四个方形,加上一个"木"形,就可得到谜底 ...查看


  • 2013计算机算法设计与分析期终考试复习题
  • 计算机算法设计与分析复习题 一.填空题 1.一个算法复杂性的高低体现在计算机运行该算法所需的时间和存储器资源上,因此算法的复杂性有 时间 复杂性和空间复杂性之分. 2.出自于"平衡子问题"的思想,通常分治法在分割原问题, ...查看


  • 历代皇后名称及封号大全
  • 皇太后名称由来 皇太后huángtàihòu [empressdowager]皇帝的母亲 皇太后是中国古代皇帝法定母亲的尊号.秦有无此称,未见纪载.自西汉起,历代沿称. [出处]:<汉书·外戚传>:"汉兴,因秦之称号, ...查看


  • 百位皇后一览表
  • 1.西汉高祖刘邦皇后(吕雉) --中国历史上第一个执权的女性 2.西汉高祖刘邦姬(薄氏) --中国历代后妃中典型的贤母形象 3.西汉文帝刘恒皇后(窦氏) --中国古代的"灰姑娘" 4.西汉武帝刘彻皇后(陈娇) --&qu ...查看


  • 萧皇后是如何成为史上最抢手皇后的
  • 历史上的萧皇后 历史上因为长得漂亮而被皇帝看中的女子数不胜数,但是,经历过多次王朝更替却始终受宠的女子却很少.据悉,萧皇后曾被六代帝王看中,可以称得上是我国古代历史上最抢手的女子. 萧皇后剧照 据史料记载,萧皇后刚刚出生时,他的父亲便让袁天 ...查看


  • 揭秘明朝钱皇后哭瞎眼睛的真实原因
  • 让购物,成为职业www.fenglingou.com 揭秘明朝钱皇后哭瞎眼睛的真实原因 明朝钱皇后 孝庄钱皇后,是明朝明英宗的第一位妻子,她是海州人,她是后封安昌伯的女人.在1442年被立为皇后.在明英宗去死后,他的儿子宪宗继续,钱皇后成为 ...查看


  • 汉朝皇帝如何迎娶皇后
  • 揭秘汉朝皇帝是如何迎娶皇后的 (2012-08-31 06:43:55) 揭秘汉朝皇帝是如何迎娶皇后的[史上唯一的处女皇后张嫣] 汉孝惠皇后张嫣,是吕太后为了亲上加亲,控制国政,而指定嫁给汉惠帝刘盈的.张嫣是个不幸的女人,她生活在吕后.惠帝 ...查看


  • 顺治皇后简介
  • 顺治皇后简介 顺治皇帝的第一位皇后姓博尔济吉特氏,是顺治生母的娘家侄女,乃多尔衮为顺治所选定.顺治八年(1651)二月,皇后之父蒙古科而沁卓礼克图亲王吴克善亲自送女儿上京,等待举行大婚典礼.但顺治对婚事很不情愿,一直借故拖延.拖到了秋季,亲 ...查看


热门内容