Advertisement
Guest User

Untitled

a guest
Jul 27th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 4.19 KB | None | 0 0
  1. var br:array[1..2500]of integer;
  2. t:array[0..51,0..51]of boolean;
  3. a:array[0..51,0..51]of integer;
  4. c,p,n,m,broj,max,maxx1,maxx2,maxy1,maxy2,maxt,x1,x2,y1,y2,i,j:integer;
  5. k:longint;
  6. procedure dfs(x,y:byte); //klasican obilazak u svakom koraku obelezavam da je prenitno polje poseceno i uvecavam brojac
  7. begin
  8. t[x,y]:=true;
  9. inc(broj);
  10. if(a[x,y]=a[x+1,y])and(t[x+1,y]=false)then dfs(x+1,y);
  11. if(a[x,y]=a[x-1,y])and(t[x-1,y]=false)then dfs(x-1,y);
  12. if(a[x,y]=a[x,y+1])and(t[x,y+1]=false)then dfs(x,y+1);
  13. if(a[x,y]=a[x,y-1])and(t[x,y-1]=false)then dfs(x,y-1)
  14. end;
  15. procedure dfsk(x,y,dx,gx,dy,gy:byte);//isto samo ne moram da brojim i pazim da ne izadjem iz kvadrata koga posmatram
  16. begin
  17. t[x,y]:=true;
  18. if(a[x,y]=a[x+1,y])and(x+1<=gx)then dfs(x+1,y);
  19. if(a[x,y]=a[x-1,y])and(x-1>=dx)then dfs(x-1,y);
  20. if(a[x,y]=a[x,y+1])and(y+1<=gy)then dfs(x,y+1);
  21. if(a[x,y]=a[x,y-1])and(y-1>=dy)then dfs(x,y-1)
  22. end;
  23. procedure o(x,y:byte);
  24. var res,i,j,ik,jk:byte;
  25. begin
  26. for i:=1 to n-x+1 do //biram gornje levo teme
  27.  for j:=1 to m-y+1 do begin
  28.                       res:=0;
  29.                       for ik:=i to i+x-1 do //idem od izabrane koordinate pa jos za x
  30.                        for jk:=j to j+y-1 do //jos za y
  31.                         if(t[ik,jk]=false)and(a[ik,jk]>0)then begin //ako polje nije 0 i ako ga nisam obiso
  32.                                                               dfsk(ik,jk,i,i+x-1,j,j+y-1); //za to polje dfs i ogranicim ga na dati kvadrat
  33.                                                               inc(res,br[a[ik,jk]]) //uvecxam rezultat za onp br od pre
  34.                                                               end;
  35.                       for ik:=i to i+x-1 do
  36.                        for jk:=j to j+y-1 do t[ik,jk]:=false; //obelezim da su svi u kvadratu koji sam obiso neposeceni
  37.                       if res>maxt then begin //ako je res vece om maksimuma maksimum postaje to i svi parametri postaju njegovi...
  38.                                        maxt:=res;
  39.                                        x1:=i;
  40.                                        y1:=j;
  41.                                        x2:=i+x-1;
  42.                                        y2:=j+y-1
  43.                                        end
  44.                       end
  45. end;
  46. begin
  47. read(n,m);
  48. for i:=1 to n do
  49.  for j:=1 to m do read(a[i,j]);
  50. read(k);
  51. //ulaz
  52. for i:=1 to n do
  53.  for j:=1 to m do
  54.   if(t[i,j]=false)and(a[i,j]>0)then begin
  55.                                     broj:=0;
  56.                                     dfs(i,j); //ako polja sa datim brojem nisam izbrojao to uradim
  57.                                               //i obelezim da sam ih posetio
  58.                                     br[a[i,j]]:=broj //stavim da je br d tog proja ovo sto sam izbrojao u dfs-u
  59.                                                      // npr. br[3]=4 u test primeru
  60.                                     end;
  61. for i:=1 to n do
  62.  for j:=1 to m do t[i,j]:=false; //t koje mi predsravlja obidjene ovratim tako da su sada svi neobidjeni
  63. for p:=2 to k div 1000000 do begin //posto mi jedno polje kosta milion ja mogu da kupim najvise k sa milion polja
  64.                              for i:=1 to trunc(sqrt(p))do //trazim sve kvadrate te povsine
  65.                               if p mod i=0 then begin
  66.                                                 o(i,p div i); //ako nadjem da je p deljivo sa a
  67.                                                 o(p div i,i) // posmatram a, p div a i p div a, a
  68.                                                 end;
  69.                              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
  70.                                               max:=maxt;
  71.                                               maxx1:=x1;
  72.                                               maxx2:=x2;
  73.                                               maxy1:=y1;
  74.                                               maxy2:=y2;
  75.                                               c:=p
  76.                                               end
  77.                              end;
  78. 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
  79. writeln(k-c*1000000);
  80. writeln(max)
  81. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement