永发信息网

求PASCAL八皇后问题程序

答案:2  悬赏:70  手机版
解决时间 2021-04-23 17:40
求PASCAL八皇后问题程序
最佳答案

procedure test(row,ld,rd:longint);
var
pos,p:longint;
begin
if row<>upperlim then
begin
pos:=upperlim and not (row or ld or rd);
while pos<>0 do
begin
p:=pos and -pos;
pos:=pos-p;
test(row+p,(ld+p)shl 1,(rd+p)shr 1);
end;
end
else inc(sum);
end;


Var


sum,upperlim:longint;


Begin


readln(n);


upperlim:=(1 shl n)-1


test(0,0,0);


writeln(sum);


End.


如果是做8皇后,就输入8就行。


上面的十多行代码是n皇后问题的一个高效位运算程序,看到过的人都夸它牛。


拿这个去交USACO,0.3s,暴爽。(Ps:一般的八皇后usaco上交,都要1.0s+,就算是cpp/c写的代码,也要RP爆高才会0.99999999……s过掉。)



=====================以上摘自matrix67 Blog并稍做修改。===========================


“Matrix67原创
转贴请注明出处”


全部回答

这时我以前做过的

附上程序和解释

program eightqueens;  var   x:array[1..8] of integer;   a,b,c:array[-7..16] of boolean;   i:integer;  procedure print;   var k:integer;   begin    for k:=1 to 8 do write(x[k]:4);    writeln;   end;  procedure try(i:integer);   var j:integer;   begin    for j:=1 to 8 do     if a[j] and b[i+j] and c[i-j]      then begin    x:=j;    a[j]:=false;    b[i+j]:=false;    c[i-j]:=false;    if i<8 then try(i+1)     else print;    a[j]:=true;    b[i+j]:=true;    c[i-j]:=true   end  end;  begin   for i:=-7 to 16 do    begin     a:=true;     b:=true;     c:=true    end;   try(1);  end.

现在循环从 i=1 ,j:=1 to 8 do 开始 此时 计算机检测到 i=1 j=1 简化为(1,1)为空,占用该位置并令该位置对应的斜线和水平方向的位置为 false ,然后程序就开始去执行try(2),注意此时计算机在i=1 这层仅仅走拉一个循环(j=1)就跳到拉i=2 这层里此时计算机从j:=1 to 8 do 又开始循环,排除 j=1,j=2 得到 (2,3)注意计算机在层里也只是走拉3(j=3)个循环然后又跳到拉i=3 这层依次类推得到(3,5),(4,2)(5,4)而在i=6 这层里计算机从j:= 1 to 8 do 都没有找到合适的位置,此时注意在i=6 这层里计算机计算机将返回到i=5 这层里,(因为用拉递归)并且释放(5,4)该位置,为什么要释放呢?因为原因很简单如果不释放的话 该位置对应的斜线和水平方向会对以后的几层造成影响,让计算机误认为为false。此时的在i=5这层里 j=4才是结束,然后计算机又会从j=5到 8 开始去找合适的位置 ,如果找不到又会返回到上一层依次类推直到计算机找到一组解 输出,假设在(8,3)这个位置是计算机找到的一组解,此时计算机又会从j=4到8 开始循环,如果找不到 计算机就会返回上一层的即i=7这层接着上一次的跳出位置走完以后的循环,依次类推不断的返回,跳出, 求解,(即令前几个位置不变,从第8个位置变换,没有空位置的。接会返回上一层)最后返回到i=1这层里,注意此时在这层里也只是走拉j=1个循环然后计算机就又开始从j= 2 去试着找....大家有没有算过求出所有的解要走过多少个循环?我想估计也不下1000个吧。其实整个过程就是一个重复的过程(即递归)倒着想在i=7 这层里的j=1 位置即(7,1) 计算机会去试从(8,1)到(8,8)这8 个位置,而在(7,2)也同样会去试这8 个位置 等等在(6,1)会试(7,1)到(7,8) 等。 这是正着考虑(1,1)这里计算机会试着从(2,1)到(2,8)这8个位置而在这8 个位置里并没有试完就有空位置 (2,3)此时计算机会在这个位置对下一层里开始试(3,1)..(3,8)依次类推,试不通的返回,接着走完上一层直到试完所有的位置!

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
花屏怎样重装显卡驱动,笔记本键盘驱动卸载后
高校一家人第一部里的孩子们现在谁最红?
2009.10.15 7点50出生的小孩女叫什么好?
我住在成都市区,要怎么去石象湖?在哪儿坐车
什么季节吃海参好?
中国邮政储蓄银行新集支行在哪里啊,我有事要
有什么好听的闽南语歌啊?
大海描述心情的句子,通过动作描写,表现其惊喜
我用光大的信用福卡的副卡消费3000元,分12期
诛仙开黄色的箱子能开出飞剑吗
卡巴斯基2010怎么添加激活码啊?
很晕。压缩文件可以不要文件名吗?进来看截图
长春吉大一院和哈尔滨二院哪个看病看的好
纾解压力最有效的方法
如何把写在纸上的文章打印到16开的纸上?
推荐资讯
吃哪种牌子的 胶原蛋白 比较好 呢
丹比蛋糕(合泰店)地址在什么地方,想过去办事
一般豆浆的浓度为多少是合格品?超市出售的豆
深圳市邦韦人力资源有限公司怎么样
请问5173上的游戏帐号安全不?
我的电脑玩CSOL黑
振峰汽配我想知道这个在什么地方
急救!婆婆半夜上半身发冷要盖的很厚,腿脚却
DNF机械怎样厉害
我觉得我是一条狗???
马来西亚锡器茶杯图案带龙的镀金
吃进去的紫薯怎么吐出红色的来啊!怀孕了
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?