您的位置:首页 > 其它

codevs1022

2015-07-18 12:05 183 查看
题目地址:http://codevs.cn/problem/1022/

分析:

把格子看成黑白相间,因为砖块1*2,显然答案就是把每个连通块 最小的 白色砖块或黑色砖块数 相加。黑白格子的判定:对于新加进队列的格子坐标,如果x,y奇偶性相同就为白(黑),不同就为黑(白)。

代码:

const dx:array[1..4] of longint=(1,0,-1,0);

dy:array[1..4] of longint=(0,1,0,-1);

var teamx,teamy:array[1..100000] of longint;

map:array[0..200,0..200] of boolean;

n,m,x,y,k,w,b,i,j,ans:longint;

function min(q,w:longint):longint;

begin

if q<w then exit(q)

else exit(w);

end;

procedure bfs(x,y:longint);

var f,r,xx,yy,i:longint;

begin

fillchar(teamx,sizeof(teamx),0);

fillchar(teamy,sizeof(teamy),0);

f:=0; r:=1; teamx[r]:=x; teamy[r]:=y;

w:=0; b:=0;

repeat

inc(f); x:=teamx[f]; y:=teamy[f];

if odd(x)=odd(y) then inc(w)

else inc(b); //黑白判定

for i:=1 to 4 do

begin

xx:=x+dx[i]; yy:=y+dy[i];

if not map[xx,yy] then

begin

inc(r); teamx[r]:=xx; teamy[r]:=yy;

map[xx,yy]:=true;

end;

end;

until f>=r;

end;

begin

readln(n,m); ans:=0;

readln(k);

for i:=1 to k do

begin

readln(x,y);

map[x,y]:=true;

end;

for i:=0 to m+1 do begin

map[0,i]:=true;

map[n+1,i]:=true;

end;

for i:=0 to n+1 do begin

map[i,0]:=true;

map[i,m+1]:=true; //加边框

end;

for i:=1 to n do

for j:=1 to m do

if not map[i,j] then

begin

bfs(i,j);

inc(ans,min(w,b));

end;

writeln(ans);

end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: