USACO1.5.4 checker challenge

         所有人都应该做过这道题,但其解法千奇百怪。这是什么题呢?它就是N皇后问题!

         今天做的是用位运算解决的,所以比较快。当然,这种方法的开山鼻祖在我的脑海中就是MATRIX67 神牛啦!所以关于具体的解法,欢迎大家google 一下原版!一次位运算所用的CPU时钟远远小于* 或者 div 之类的,而mod 更是没法比了……说的通俗点儿就是位运算是计算机运算的本质所在!

         用到了个lowbit 函数,简单研究研究。它的作用是取出二进制数的最低位,不仅仅在本题,在树状数组中也有应用。原理很简单:-x 就是 not x +1 表示的数值,这样的话not x 中最低的那位是0,加上一之后那位不就成1了么!

program checker; var map:array[0..15] of longint; pair:array[0..9000] of longint; ans,n,num,i:longint; function lowbit(x:longint):longint; begin exit(x and -x); end; procedure dfs(hrzn,vtcl,left,right:longint); var state,k,i:longint; begin if hrzn>n then begin inc(ans); if ans<=3 then begin for i:=1 to n-1 do write(pair[map[i]],' '); writeln(pair[map[n]]); end; exit; end; state:=num and not (vtcl or left or right); while state>0 do begin k:=lowbit(state); dec(state,k); map[hrzn]:=k; dfs(hrzn+1,vtcl+k,(left+k) shl 1 and num,(right+k) shr 1 and num); end; end; begin assign(input,'checker.in'); reset(input); assign(output,'checker.out'); rewrite(output); readln(n); ans:=0; num:=1 shl n - 1; for i:=0 to n-1 do pair[1 shl i]:=i+1; dfs(1,0,0,0); writeln(ans); close(input); close(output); end.

你可能感兴趣的:(解题报告)