覆盖(染色算法)——史上最强解析
来源:互联网 发布:身份证照片软件 编辑:程序博客网 时间:2024/06/06 05:01
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;//存储x teamy[r]:=y;//存储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);//建造黑白相间的图,w用来记录白块数,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;//不能走的地方标记为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.
0 0
- 覆盖(染色算法)——史上最强解析
- NOIP2014联合权值——史上最强解析
- 覆盖——染色技巧
- 史上最强排序算法合集
- "周易之争”——史上最强的帖子!
- Struts2——史上最强MVC框架
- 史上最强视频网站真实地址解析
- 史上最强视频网站真实地址解析
- 史上最强视频网站真实地址解析
- 史上最强视频网站真实地址解析
- 史上最强视频网站真实地址解析
- 史上最强IDE集成开发环境——Code::Blocks安装过程(吐血推荐)
- 史上最强算法论战:请不要嘻哈,这是哈希
- 史上最强的绕口令
- 史上最强的黑客
- 史上最强的回帖
- 史上最强的跟帖
- 史上最强的自我介绍
- Connection to https://dl-ssl.google.com refused
- MongoDB权威指南-增删查改
- android之 MAT、DDMS 等内存查看工具
- 数据传递的问题,求帮助!!!!!!!!!!!!!!
- JNI (一)、环境搭建
- 覆盖(染色算法)——史上最强解析
- 在UITableViewCell上添加多行的UILabel
- python写入文件乱码处理
- Mac OS使用 IntelliJ IDEA 快捷键
- iOS编程——NSUserDefaults来保存自定义Object
- UML Section Two 概括
- CocoaPods安装和使用教程
- meta标签
- java简单的测试方法执行了多少时间