JZOJ 3807 【NOIP2014模拟8.25】地砖铺设

地砖铺设

Description

给出一个长为 N ,宽为M的网格图,用一些由含有相同字母的正方形填满这个网格(一个正方形内含有的字母必须相同,不同的正方形含有的字母不一定相同),使得相邻的两个正方形含有的字母不同,输出字典序最小的满足条件的网格图。

Data Constraint

N ,M<= 100

Solution

贪心。
从上到下,从左到右对网格图进行构造,然后每次判断 与前面的格子进行合并构成一个更大的正方形更优 还是 该格子作为一个新的正方形的左上顶点更优,选最优方案构造即可。

Code(Pascal)

var
    ch:array[0..1000,0..1000] of char;
    x,y,ok,bc:array[0..1000,0..1000] of longint;
    n,m,j,k,l,i:longint;
    bz:array['A'..'E'] of boolean;
    cc:char;
begin
    readln(n,m);
    for i:=0 to n+1 do
    for l:=0 to m+1 do ch[i,l]:=' ';
    for l:=0 to m+1 do ch[0,l]:='E';
    for l:=0 to n+1 do ch[l,0]:='E';
    for i:=1 to n do
    begin
        for l:=1 to m do
        begin
            if ch[i,l]<>' ' then continue;
            ok[i,l]:=1;
            fillchar(bz,sizeof(bz),true);
            bz[ch[i,l-1]]:=false;  bz[ch[i-1,l]]:=false;
            if ch[i,l+1]<>' ' then bz[ch[i,l+1]]:=false;
            for cc:='A' to 'E' do
            if bz[cc] then break;
            bc[i,l]:=1;
            if ch[i,l-1]>cc then ch[i,l]:=cc else
            if (ok[i,l-1]=1) and (ch[i-1,l]<>ch[i,l-1]) and (i+bc[i,l-1]<=n) then
            begin
                for j:=1 to bc[i,l-1] do
                ch[i+j-1,l]:=ch[i,l-1];
                bc[i,l]:=bc[i,l]+bc[i,l-1];
                for j:=l downto l-bc[i,l-1] do
                ch[i+bc[i,l-1],j]:=ch[i,l-1];
            end else ch[i,l]:=cc;
        end;
    end;
    for i:=1 to n do
    begin
        for l:=1 to m do write(ch[i,l]);
        writeln;
    end;
end.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值