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.
分析:
把格子看成黑白相间,因为砖块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.
相关文章推荐
- js获取颜色,颜色3中类型的转换
- php 操作sphinx
- sql汇总
- codevs1021
- 关于 iMindMap7 的使用介绍
- HDU-1619 Unidirectional TSP dp
- plsql连接win7 64位系统的oracle
- CSS3设计边框忽隐忽现功能
- [Ubuntu--Install]文本比较工具meld安装
- “菜鸟”程序员和“大神”程序员差距在哪里
- oracle10g卸载方法
- [译]用R语言做挖掘数据《六》
- Servlet Filter过滤器
- LeetCode#198 House Robber
- [Ubuntu--Install]AVI视频无法播放问题
- 强引用和弱引用
- Java内存区域与内存溢出
- 树梅派2如何使用3G无线网卡(中兴ZTE,MF110)上网
- [Ubuntu--System]更新管理器提示/boot空间不足
- codevs1020