2009东莞特长生 Q4:开发区规划

四、开发区规划
提交文件:d.pas / d.exe
输入文件:d.in   
输出文件:d.out
问题描述:
    小王是D市主管经济的副市长,由于经济发展的需要,要在D市组建一个高新技术开发区,经过研究,规划局在D市的东部划出了一块土地作为开发区选址。
    棘手的是,这块土地有些历史文化遗址散布在某些格子内,这些历史文化遗址是万万不能拆除的,否则将激起民愤,小王深知这一点,因此,他的新建筑在选址时要避开这些格子。
  假设新的建筑物有P种规格,每种建筑物都是正方形的,占地为Ti*Ti格 (1<=i<=P)。
    现在请你来当小王的秘书 帮他完成这个光荣而艰巨的任务。
数据输入:
  从文件d.in读入数据,输入文件第一行包含三个数,分别代表N,M,P (1<=N,M<=2000,1<=P<=1000)。随后的n行,每行有m个011表示该格为空地,0表示该格有历史文化遗址)。
  接下来的P行每行有一个整数Ti (1.out中,共有P行,每行一个整数,第i行的数代表边长为Ti的建筑物选址方案数。
输入输出样例
d.in
4 4 2
1011
1111
1110
1110
2
3
d.out
5
1

思路:

map2[i,j]表示地i,j个点向左上方拓展的最大正方形的边长
sum[i]记录边长为i的正方形空地有多少块
最后跑一遍sum来统计合适的选址方案

var
 map:array[0..2001]of ansistring;
 map2:array[0..2001,0..2001]of longint;
 sum:array[0..2001]of longint;
 i,n,j,m,s,t,max,ans:longint;
function min(a,b,c:longint):longint;
begin
 if (a<=b)and(a<=c)then exit(a);
 if (b<=a)and(b<=c)then exit(b);
 exit(c);
end;

begin

 readln(n,m,s);
 for i:=1 to n do
   begin
     readln(map[i]);
     for j:=1 to m do
       begin
         if (i=1)or(j=1) then
           begin
             if map[i,j]<>'0' then map2[i,j]:=1
               else map2[i,j]:=0;
           end
         else
           if map[i,j]<>'0' then
            map2[i,j]:=min(map2[i-1,j],map2[i-1,j-1],map2[i,j-1])+1;
         inc(sum[map2[i,j]]);
         if map2[i,j]>max then max:=map2[i,j];
    end;
   end;
 for i:=1 to s do
   begin
     read(t);
     for j:=t to max do
      ans:=ans+sum[j];
     writeln(ans);
     ans:=0;
   end;
end.


你可能感兴趣的:(Pascal)