Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var br:array[1..2500]of integer;
- t:array[0..51,0..51]of boolean;
- a:array[0..51,0..51]of integer;
- c,p,n,m,broj,max,maxx1,maxx2,maxy1,maxy2,maxt,x1,x2,y1,y2,i,j:integer;
- k:longint;
- procedure dfs(x,y:byte); //klasican obilazak u svakom koraku obelezavam da je prenitno polje poseceno i uvecavam brojac
- begin
- t[x,y]:=true;
- inc(broj);
- if(a[x,y]=a[x+1,y])and(t[x+1,y]=false)then dfs(x+1,y);
- if(a[x,y]=a[x-1,y])and(t[x-1,y]=false)then dfs(x-1,y);
- if(a[x,y]=a[x,y+1])and(t[x,y+1]=false)then dfs(x,y+1);
- if(a[x,y]=a[x,y-1])and(t[x,y-1]=false)then dfs(x,y-1)
- end;
- procedure dfsk(x,y,dx,gx,dy,gy:byte);//isto samo ne moram da brojim i pazim da ne izadjem iz kvadrata koga posmatram
- begin
- t[x,y]:=true;
- if(a[x,y]=a[x+1,y])and(x+1<=gx)then dfs(x+1,y);
- if(a[x,y]=a[x-1,y])and(x-1>=dx)then dfs(x-1,y);
- if(a[x,y]=a[x,y+1])and(y+1<=gy)then dfs(x,y+1);
- if(a[x,y]=a[x,y-1])and(y-1>=dy)then dfs(x,y-1)
- end;
- procedure o(x,y:byte);
- var res,i,j,ik,jk:byte;
- begin
- for i:=1 to n-x+1 do //biram gornje levo teme
- for j:=1 to m-y+1 do begin
- res:=0;
- for ik:=i to i+x-1 do //idem od izabrane koordinate pa jos za x
- for jk:=j to j+y-1 do //jos za y
- if(t[ik,jk]=false)and(a[ik,jk]>0)then begin //ako polje nije 0 i ako ga nisam obiso
- dfsk(ik,jk,i,i+x-1,j,j+y-1); //za to polje dfs i ogranicim ga na dati kvadrat
- inc(res,br[a[ik,jk]]) //uvecxam rezultat za onp br od pre
- end;
- for ik:=i to i+x-1 do
- for jk:=j to j+y-1 do t[ik,jk]:=false; //obelezim da su svi u kvadratu koji sam obiso neposeceni
- if res>maxt then begin //ako je res vece om maksimuma maksimum postaje to i svi parametri postaju njegovi...
- maxt:=res;
- x1:=i;
- y1:=j;
- x2:=i+x-1;
- y2:=j+y-1
- end
- end
- end;
- begin
- read(n,m);
- for i:=1 to n do
- for j:=1 to m do read(a[i,j]);
- read(k);
- //ulaz
- for i:=1 to n do
- for j:=1 to m do
- if(t[i,j]=false)and(a[i,j]>0)then begin
- broj:=0;
- dfs(i,j); //ako polja sa datim brojem nisam izbrojao to uradim
- //i obelezim da sam ih posetio
- br[a[i,j]]:=broj //stavim da je br d tog proja ovo sto sam izbrojao u dfs-u
- // npr. br[3]=4 u test primeru
- end;
- for i:=1 to n do
- for j:=1 to m do t[i,j]:=false; //t koje mi predsravlja obidjene ovratim tako da su sada svi neobidjeni
- for p:=2 to k div 1000000 do begin //posto mi jedno polje kosta milion ja mogu da kupim najvise k sa milion polja
- for i:=1 to trunc(sqrt(p))do //trazim sve kvadrate te povsine
- if p mod i=0 then begin
- o(i,p div i); //ako nadjem da je p deljivo sa a
- o(p div i,i) // posmatram a, p div a i p div a, a
- end;
- if maxt>max then begin //ako neki od tih kvadrata ima bolji rezultat od prethodnog maksimuma onda on postaje maksimum i pamtim mu koordinate i cenu
- max:=maxt;
- maxx1:=x1;
- maxx2:=x2;
- maxy1:=y1;
- maxy2:=y2;
- c:=p
- end
- end;
- writeln(maxy1,' ',n-maxx2+1,' ',maxy2,' ',n-maxx1+1); //posto sam ja unosio klasicnu matricu a ovde se trazi neka ne standardna samo pretvorim koordinate
- writeln(k-c*1000000);
- writeln(max)
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement