用二進位制優化常數卡過Pku3074 Sudoku

2021-06-19 12:22:01 字數 2512 閱讀 7238

這道題看起來用暴力搜尋似乎不可能過,但是因為二進位制的執行速度實在是太快了。我們可以用二進位制運算來代替布林型的for迴圈列舉。這樣,我們便可以節省大量時間。

我是用了l[i],h[i],kuai[i]分別代表第i列,第i行,第i塊的狀態,0代表未出現過,1代表已出現。

我還每次找可以填的數字最少的格仔進行搜尋,便把這題卡過去了。

接下來上**:

const

w:array[0..8,0..8]of longint=((0,0,0,1,1,1,2,2,2),

(0,0,0,1,1,1,2,2,2),

(0,0,0,1,1,1,2,2,2),

(3,3,3,4,4,4,5,5,5),

(3,3,3,4,4,4,5,5,5),

(3,3,3,4,4,4,5,5,5),

(6,6,6,7,7,7,8,8,8),

(6,6,6,7,7,7,8,8,8),

(6,6,6,7,7,7,8,8,8));

varbb,aa:array[0..512]of longint;

a:array[0..8,0..8]of longint;

h,l,kui:array[0..8]of longint;

now,minn,x,y,ans,n,m,i,j,k:longint;

s:string;

procedure dfs(x,y:longint);

varii,jj,xx,yy,minn,i,j,k:longint;

begin

if (a[x,y]<>-1) then

begin

ans:=1;

exit;

end;

i:=1;

j:=l[y] or h[x] or kui[w[x,y]];

if j=511 then

exit;

while i<512 do

begin

if j or i<>j then

begin

l[y]:=l[y] or i;

h[x]:=h[x] or i;

kui[w[x,y]]:=kui[w[x,y]]or i;

a[x,y]:=bb[i];

minn:=16;

xx:=0;yy:=0;

ii:=0;

while ii<=8 do

begin

for jj:=0 to 8 do

if a[ii,jj]=-1 then

begin

k:=l[jj] or h[ii] or kui[w[ii,jj]];

if aa[k]0 then

exit;

l[y]:=l[y] and (not i);

h[x]:=h[x] and (not i);

kui[w[x,y]]:=kui[w[x,y]] and (not i);

end;

i:=i<<1;

end;

a[x,y]:=-1;

end;

begin

bb[1]:=0; bb[2]:=1; bb[4]:=2; bb[8]:=3; bb[16]:=4;

bb[32]:=5; bb[64]:=6; bb[128]:=7;bb[256]:=8;

for k:=0 to 512 do

begin

now:=0;

if k or 1<>k then

inc(now);

if k or 2<>k then

inc(now);

if k or 4<>k then

inc(now);

if k or 8<>k then

inc(now);

if k or 16<>k then

inc(now);

if k or 32<>k then

inc(now);

if k or 64<>k then

inc(now);

if k or 128<>k then

inc(now);

if k or 256<>k then

inc(now);

aa[k]:=now;

end;

while not eof do

begin

fillchar(h,sizeof(h),0);

fillchar(l,sizeof(l),0);

fillchar(kui,sizeof(kui),0);

fillchar(a,sizeof(a),$ff);

readln(s); ans:=0;

if s[1]='e' then

break;

for i:=0 to 80 do

if s[i+1]<>'.' then

begin

j:=ord(s[i+1])-ord('1');

a[i div 9,i mod 9]:=j;

h[i div 9]:=h[i div 9] or (1<

序列 2018 10 27 二進位制優化

我們可以發現,aor ba or b aorb 一定不會比a aa或者b bb要小,所以直接輸出最大的o n o n o n 內的最大或值。對於a an dba and b aand b是會越來越小的,所以長度為k kk的區間一定是有最優解,此題的關鍵就在於處理這個o 30 m o 30m o 30...

用二進位制優化多重揹包問題

多重揹包是這樣的乙個問題 有n種物品,第i種物品的體積為ci,價值是wi,但是每種物品的數量都是有限的,為ni。現在有容量為v的揹包,請你放入若干物品,使獲得的價值盡量大。樸素演算法 把n種物品逐個拆分,得到 ni個物品,則原問題可轉化為01揹包求解。這樣做的時間複雜度為o v n 或者是在列舉種類...

用C 實現二進位制的減法(包括二進位制小數)

用c 實現二進位制的減法 包括二進位制小數 作為乙個大學汪,我開始接觸程式設計。前兩天老師讓寫乙個二進位制算術編碼,於是我遇到了這樣乙個問題,怎麼實現二進位制數的減法。熬了兩天的夜,寫出了下面的 若有不對的地方大家海涵 構建二進位制減法方法 二進位制減數 二進位制被減數 二進位制得數 public ...