codevs天梯 棋盘染色2
来源:互联网 发布:电脑里编程开发 编辑:程序博客网 时间:2024/05/06 05:21
有一个5*N的棋盘,棋盘中的一些格子已经被染成了黑色,你的任务是对最少的格子染色,使得所有的黑色能连成一块。
分析:这题很容易想到是广搜,但数据那么大,如果一个一个点来更新就gg了==。所以开出一个树状数组对最大块进行预处理,剩下就没什么好说的了。
- const
- maxn=102;
- type
- node=record
- x,y:longint;
- end;
- aa=array[0..6]of longint;
- var
- f:array[0..maxn,0..1204]of longint;
- a:array[0..maxn]of longint;
- fa:array[1..4]of longint;
- flag:array[1..4]of boolean;
- n:longint;
-
- procedure init;
- var
- i,j:longint;
- s:char;
- begin
- readln(n);
- for i:=1 to n do
- begin
- for j:=1 to 5 do
- begin
- read(s);
- a[i]:=a[i]<<1+ord(s)-ord('0');
- end;
- readln;
- end;
- while n>0 do
- begin
- if a[n]>0 then break;
- dec(n);
- end;
- if n=0 then
- begin
- write(0);
- halt;
- end;
- end;
-
- procedure change(var a:aa;b,c:longint);
- var
- i:longint;
- begin
- for i:=1 to 5 do
- if a[i]=b then
- begin
- a[i]:=c;
- if (a[i-1]<>0) and (a[i-1]<10) then change(a,a[i-1],c);
- if (a[i+1]<>0) and (a[i+1]<10) then change(a,a[i+1],c);
- end;
- end;
-
- procedure get(var a:aa);
- var
- i,c:longint;
- begin
- c:=10;
- for i:=1 to 5 do
- if (a[i]<>0) and (a[i]<10) then
- begin
- inc(c);
- change(a,a[i],c);
- end;
- for i:=1 to 5 do
- if a[i]>0 then dec(a[i],10);
- end;
-
- function bit(x:longint):longint;
- begin
- if x=0 then exit(0);
- exit(bit(x-(x and -x))+1);
- end;
-
- var
- q:array[0..maxn*1024]of node;
-
- procedure work;
- var
- head,tail,i,j,k,ans,save:longint;
- s,t:aa;
- flag:boolean;
- begin
- fillchar(f,sizeof(f),1);
- t[0]:=0;
- t[6]:=0;
- ans:=500;
- f[0,0]:=0;
- q[1].x:=0;
- q[1].y:=0;
- head:=1;
- tail:=1;
- while head<=tail do
- begin
- save:=q[head].y;
- for i:=1 to 5 do
- begin
- s[i]:=q[head].y and 3;
- q[head].y:=q[head].y>>2;
- end;
- q[head].y:=save;
- if q[head].x=n then
- begin
- flag:=true;
- for i:=1 to 5 do
- if s[i]>1 then flag:=false;
- if flag then
- if ans>f[q[head].x,q[head].y] then ans:=f[q[head].x,q[head].y];
- inc(head);
- continue;
- end;
- for i:=0 to 31 do
- if i and a[q[head].x+1]=0 then
- begin
- for j:=1 to 5 do
- t[j]:=(((a[q[head].x+1]+i)>>(j-1))and 1)*(j+3);
- k:=0;
- for j:=1 to 5 do
- if (s[j]>0) and (t[j]>0) then
- begin
- t[j]:=s[j];
- k:=k or (1<<s[j]);
- end;
- flag:=true;
- for j:=1 to 5 do
- if (s[j]>0) and (k and (1<<s[j])=0) then flag:=false;
- if flag=false then continue;
- get(t);
- k:=0;
- for j:=5 downto 1 do
- k:=k<<2+t[j];
- if f[q[head].x+1,k]>500 then
- begin
- inc(tail);
- q[tail].x:=q[head].x+1;
- q[tail].y:=k;
- end;
- if f[q[head].x+1,k]>f[q[head].x,q[head].y]+bit(i) then f[q[head].x+1,k]:=f[q[head].x,q[head].y]+bit(i);
- end;
- inc(head);
- end;
- write(ans);
- end;
-
- begin
- init;
- work;
- end.
1 0
- codevs天梯 棋盘染色2
- [CODEVS 1050] 棋盘染色 2
- CODEVS 1049 棋盘染色
- codevs1050 棋盘染色 2
- 20160314 CodeVS 1005 生日礼物,1031 质数环,1049 棋盘染色
- (昨天的)codevs天梯过河卒 简短的棋盘dp
- codevs 天梯 白银级
- CodeVS天梯白银
- CodeVS天梯黄金
- codevs天梯 乘积最大
- codevs天梯 高精度加法
- codevs天梯高精度减法
- codevs天梯高精度乘法
- codevs天梯 导弹拦截
- codevs天梯 骑士游历
- codevs 天梯 数字三角形
- codevs天梯四色问题
- codevs天梯 乌龟棋
- Angularjs refresh but jump to the home page
- 继承 关键字extends
- ubuntu交换caps和ctrl的方法
- C/C++中extern关键字详解
- HDU 1501 Zipper (DFS)
- codevs天梯 棋盘染色2
- 信源编码作业二
- ios开发之字符串操作(四)
- Java环境配置
- UART 和 USART 有区别
- 用PHP SDK做支付宝APP支付(下单及验签)
- Spark on Mesos: 搭建Mesos的一些问题
- Java设计模式(一):单例模式,防止反射和反序列化漏洞
- 前端框架Aurelia