這道題看起來用暴力搜尋似乎不可能過,但是因為二進位制的執行速度實在是太快了。我們可以用二進位制運算來代替布林型的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 ...