Cod sursa(job #67192)

Utilizator info_arrandrei gigea info_arr Data 22 iunie 2007 21:50:38
Problema Castel Scor 30
Compilator fpc Status done
Runda Arhiva de probleme Marime 3.46 kb
{free pascal}


{$IFDEF NORMAL}
  {$I-,Q-,R-,S-}
{$ENDIF NORMAL}
{$IFDEF DEBUG}
  {$I+,Q+,R+,S-}
{$ENDIF DEBUG}
{$IFDEF RELEASE}
  {$I-,Q-,R-,S-}
{$ENDIF RELEASE}

const nmax=155;
      inmax=30000;

type matrix = array[0..nmax,0..nmax] of integer;
     vector = array[0..nmax*nmax+1000] of integer;

     point = record lin,col:integer; end;

var a,vrf:matrix;
    c:vector;
    ct,max,ot:longint;
    q:array[0..8000005] of point;
    i,j,n,m,k,ini,inj:integer;
    fi,fo:text;
    first,last:longint;
    start,pu,pc:point;
    indx,chei,add:longint;

  procedure qin(p:point);
   begin
    inc(last);
    if last=8000000 then last:=1;
    q[last]:=p;
   end;

  function qout:point;
   begin
    inc(first);
    if first=8000000 then first:=1;
    qout:=q[first];
   end;


  function isempty:boolean;
   begin isempty:=first=last; end;


  procedure bord;
   begin
    for i:=0 to m+1 do
     begin
      a[i,0]:=inmax; a[i,n+1]:=inmax; end;
    for i:=0 to n+1 do
     begin
      a[0,i]:=inmax; a[0,m+1]:=inmax; end;
   end;

begin
 ct:=0;
 max:=0;
 assign(fi,'castel.in'); reset(fi);
 assign(fo,'castel.out'); rewrite(fo);
 readln(fi,m,n,k);
 for i:=1 to m do
  for j:=1 to n do
   read(fi,a[i,j]);
 bord;
 if k mod n=0 then ini:=(k div n)
  else ini:=k div n + 1;
 if k mod n=0 then inj:=n
  else inj:=(k mod n);

 start.lin:=ini;
 start.col:=inj;
 chei:=1;


 qin(start);
 c[k]:=1;
 chei:=1;
 vrf[ini,inj]:=1;
 ct:=1;

 while not isempty do
  begin
   pc:=qout;
   pu.lin:=pc.lin+1; pu.col:=pc.col;

   if a[pu.lin,pu.col]<>inmax then
   if c[a[pu.lin,pu.col]]=1 then
      begin
       if vrf[pu.lin,pu.col]=0 then
        begin
         vrf[pu.lin,pu.col]:=1;
         inc(ct);
        end;
       qin(pu);
       if pu.col mod n=0  then add:=n
        else add:=pu.col mod n;
       indx:=(pu.lin-1) * n + add;
       if c[indx]=0 then begin inc(chei); c[indx]:=1; end;
      end;
   pu.lin:=pc.lin-1; pu.col:=pc.col;

   if a[pu.lin,pu.col]<>inmax then
   if c[a[pu.lin,pu.col]]=1 then
      begin
       if vrf[pu.lin,pu.col]=0 then
        begin
         vrf[pu.lin,pu.col]:=1;
         inc(ct);
        end;
       qin(pu);
       if pu.col mod n =0 then add:=n
        else add:=pu.col mod n;
       indx:=(pu.lin-1) * n + add;
       if c[indx]=0 then begin inc(chei); c[indx]:=1; end;
      end;
   pu.lin:=pc.lin; pu.col:=pc.col+1;

   if a[pu.lin,pu.col]<>inmax then
   if c[a[pu.lin,pu.col]]=1 then
      begin
       if vrf[pu.lin,pu.col]=0 then
        begin
         vrf[pu.lin,pu.col]:=1;
         inc(ct);
        end;
       qin(pu);
       if pu.col mod n=0 then add:=n
        else add:=pu.col mod n;
       indx:=(pu.lin-1) * n + add;
       if c[indx]=0 then begin inc(chei); c[indx]:=1; end;
      end;
   pu.lin:=pc.lin; pu.col:=pc.col-1;

   if a[pu.lin,pu.col]<>inmax then
   if c[a[pu.lin,pu.col]]=1 then
      begin
       if vrf[pu.lin,pu.col]=0 then
        begin
         vrf[pu.lin,pu.col]:=1;
         inc(ct);
        end;
       qin(pu);
       if pu.col mod n=0 then add:=n
        else add:=pu.col mod n;
       indx:=(pu.lin-1) * n + add;
       if c[indx]=0 then begin inc(chei); c[indx]:=1; end;
      end;

    if chei=max then begin
     inc(ot);

     if ot=ct*1000 then break;
    end;

    if chei > max then begin
     max:=chei;
     ot:=0;
    end;


  end;
writeln(fo,ct);
close(fi);
close(fo);
end.