輸入 第一行n,m
後面有乙個乙個數出現的為詢問數q
sample input
1 2
01 4
0 0
2 0
0 1
0 2sample output
0.7854
4.8584
0.0000
4.8584
分情況討論,每一次有乙個詢問的點我們就把它可以到達的不在隔板上的點dfs出來,然後再隨便討論一下就好了
感覺自己好隨意啊
var
a,b:array[-1..305,-1..305]of longint;
bz,bz1:array[-1..205,-1..205]of boolean;
s:array[0..40005,1..2]of longint;
h:array[1..8,1..2]of longint=((-1,-1),(-1,0),(-1,1),(0,-1),(0,1),(1,-1),(1,0),(1,1));
g:array[1..2,1..2]of longint=((1,-1),(1,1));
nc:array[1..4,1..2]of longint=((-1,-1),(-1,0),(0,-1),(0,0));
i,j,k,l,n,m,t1,t2,q,z,zz,o:longint;
ans:extended;
x:char;
procedure
dfs(t1,t2:longint);
var i,x,y:longint;
begin
for i:=1to8
dobegin
x:=t1+h[i,1];
y:=t2+h[i,2];
if (x<0) or (y<0) or (x>n*2) or (y>m*2) then
continue;
if bz[x,y]=true
then
continue;
if (xand (yand (b[t1-1,t2-1]>0) then
continue;
if (xand (y>t2) and (b[t1-1,t2]>0) then
continue;
if (x>t1) and (yand (b[t1,t2-1]>0) then
continue;
if (x>t1) and (y>t2) and (b[t1,t2]>0) then
continue;
inc(z);
s[z,1]:=x;
s[z,2]:=y;
bz[x,y]:=true;
dfs(x,y);
end;
end;
begin
// assign(input,'t2.in'); reset(input);
readln(n,m);
for i:=1
to n do
begin
for j:=1
to m do
begin
read(x);
t1:=(i-1)*2;
t2:=(j-1)*2;
bz1[t1+1,t2]:=true;
bz1[t1,t2+1]:=true;
bz1[t1+1,t2+2]:=true;
bz1[t1+2,t2+1]:=true;
if x='0'
then
begin
b[t1,t2]:=1;
b[t1+1,t2+1]:=2;
endelse
begin
b[t1,t2+1]:=3;
b[t1+1,t2]:=4;
end;
end;
readln;
end;
readln(q);
for o:=1
to q do
begin
readln(t1,t2);
bz:=bz1;
if bz1[t1,t2]=true
then
begin
writeln('0.0000');
continue;
end;
bz[t1,t2]:=true;
z:=1;
s[z,1]:=t1;
s[z,2]:=t2;
dfs(t1,t2);
fillchar(bz,sizeof(bz),0);
zz:=z;
for i:=1
to z do
bz[s[i,1],s[i,2]]:=true;
ans:=0;
for i:=1
to z do
begin
for j:=1to2
doif bz[s[i,1]+g[j,1],s[i,2]+g[j,2]]=true
then ans:=ans+1;
for j:=1to4
dobegin
t1:=s[i,1]+nc[j,1];
t2:=s[i,2]+nc[j,2];
if (t1<0) or (t2<0) or (t1>n*2) or (t2>m*2) then
continue;
if (j=1) and (b[t1,t2]=1) then ans:=ans+1-0.25*pi else
if (j=1) and (b[t1,t2]=2) then ans:=ans+0.25*pi else
if (j=2) and (b[t1,t2]=3) then ans:=ans+1-0.25*pi else
if (j=2) and (b[t1,t2]=4) then ans:=ans+0.25*pi else
if (j=3) and (b[t1,t2]=3) then ans:=ans+0.25*pi else
if (j=3) and (b[t1,t2]=4) then ans:=ans+1-0.25*pi else
if (j=4) and (b[t1,t2]=1) then ans:=ans+0.25*pi else
if (j=4) and (b[t1,t2]=2) then ans:=ans+1-0.25*pi;
end;
end;
writeln(ans:0:4);
end;
// close(input);
end.
NOIP2016提高組模擬 積木
比賽的時候用了個神奇的小暴力,本來打算拿40分,沒想到暴力出奇蹟,隨機資料下表現優良,居然碾過去了。暴力方法不講,只貼 僅供對拍。正解顯然要用狀態壓縮 看資料範圍 設fs i,0 1 2 s表示當前已選擇的積木集合,i表示在最上方的積木編號,0 1 2表示最上方的積木哪面朝上。轉移方程容易推導。暴力...
計數 NOIP2016提高A組模擬7 15
樣例輸入 2 10 樣例輸出 90資料範圍 剖解題目 題目說的很明了了。思路 求方案數,一般會設計道dp,規律之類的。解法 數字dp,設f i j 表示當前到了第i位,這一位的數字是j的方案數。自然有 f i j f i 1 l f i j 0 l k 且 l 0 and j 0 看到這位數,很明顯...
NOIP2016提高A組模擬9 2 單峰
問1 n,n個數的全排列中有多少個滿足單峰序列的性質,並把答案mod 1e9 7 這題還是很簡單的,一開始打了乙個50分的做法,然後發現答案就是2n 1,然後沒有發現輸入也會爆,於是就得了50分 我們容易發現峰一定是最大的那個數,我們把峰放到每乙個位置上,然後在往峰的左邊隨便填一些數,每種填數的方法...