Cod sursa(job #18331)

Utilizator CezarMocanCezar Mocan CezarMocan Data 18 februarie 2007 11:33:36
Problema Zone Scor 0
Compilator fpc Status done
Runda preONI 2007, Runda 2, Clasa a 9-a si gimnaziu Marime 2.42 kb
type vector=array[0..1010]of longint;
var v3,v,mv,mv3,zero:vector;
    m,s:array[1..520,1..520]of longint;
    n,i,j,k,l1,l2,c1,c2:longint;

function gasit(n:longint;var v,mk:vector):boolean;
var i:longint;
begin
gasit:=false;
for i:=1 to v[0] do
    if (v[i]=n)and(mk[i]=0) then
       begin
       mk[i]:=1;
       gasit:=true;
       exit;
       end;
end;

begin
assign(input,'zone.in');reset(input);
assign(output,'zone.out');rewrite(output);
readln(n);
for i:=1 to 9 do
    read(v[i]);
v[0]:=9;
for i:=1 to n do
    for j:=1 to n do
        read(m[i,j]);
s[1,1]:=1;
for i:=2 to n do
    begin
    s[1,i]:=s[1,i-1]+m[1,i];
    s[i,1]:=s[i-1,1]+m[i,1];
    end;
for i:=2 to n do
    for j:=2 to n do
        s[i,j]:=s[i-1,j]+s[i,j-1]+m[i,j]-s[i-1,j-1];
for i:=1 to 9 do
    for j:=i+1 to 9 do
        for k:=j+1 to 9 do
            begin
            inc(v3[0]);
            v3[v3[0]]:=v[i]+v[j]+v[k];
            end;
for l1:=1 to n-2 do
    begin
    if gasit(s[l1,n],v3,mv3) then
       begin
       for l2:=l1+1 to n-1 do
           if gasit(s[l2,n]-s[l1,n],v3,mv3)and(gasit(s[n,n]-s[l2,n],v3,mv3))
              then begin
              mv:=zero;
              for c1:=1 to n-2 do
                  if gasit(s[l1,c1],v,mv)and(gasit(s[l2,c1]-s[l1,c1],v,mv))and(gasit(s[n,c1]-s[l2,c1],v,mv))
                     then begin
                     for c2:=c1+1 to n-1 do
                         begin
                         mv:=zero;
                         if gasit(s[l1,c1],v,mv)and
                         (gasit(s[l2,c1]-s[l1,c1],v,mv))and
                         (gasit(s[n,c1]-s[l2,c1],v,mv))and
                         (gasit(s[l1,c2]-s[l1,c1],v,mv))and
                         (gasit(s[l2,c2]-s[l1,c2]-s[l2,c1]+s[l1,c1],v,mv))and
                         (gasit(s[n,c2]-s[l2,c2]-s[n,c1]+s[l2,c1],v,mv))and
                         (gasit(s[l1,n]-s[l1,c2],v,mv))and
                         (gasit(s[l2,n]-s[l1,n]-s[l2,c2]+s[l1,c2],v,mv))and
                         (gasit(s[n,n]-s[l2,n]-s[n,c2]+s[l2,c2],v,mv))
                         then
                             begin
                             writeln(l1,' ',l2,' ',c1,' ',c2);
                             close(output);
                             halt;
                             end;
                         end;
                     end;
              end;
       end;
    end;
close(input);close(output);
end.