Cod sursa(job #185666)

Utilizator StigmaSimina Pitur Stigma Data 25 aprilie 2008 19:25:43
Problema Castel Scor 30
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.23 kb
program castel;
type point=^rec;
     rec=record
      info:integer;
      au:point;
      end;
var n,m,k:integer;
i,nr:integer;
prim,ultim:point;
u,a:array[1..22500] of integer;
lst:array[1..22500] of point;
g:text;

procedure pop(var x:integer; var c,u:point);
var p:point;
begin
p:=c;
x:=p^.info;
if prim=u then u:=nil;
c:=c^.au;
dispose(p);
end;

procedure push(x:integer; var c,u:point);
var p:point;
begin
new(p);
p^.info:=x;
p^.au:=nil;
if c=nil then
c:=p
else
u^.au:=p;
u:=p;
end;

procedure pop_list(var x:integer; var c:point);
var p:point;
begin
p:=c;
x:=p^.info;
c:=c^.au;
dispose(p);
end;


procedure push_list(x:integer; var l:point);
var p:point;
begin
new(p);
p^.info:=x;
p^.au:=l;
l:=p;
end;


procedure readdata;
var f:text;
var cnr,i,j:integer;
begin
assign(f,'castel.in');reset(f);
readln(f,n,m,k);
for i:=1 to n do
begin
for j:=1 to m do
begin
read(f,cnr);
nr:=(i-1)*m+j;
a[nr]:=cnr;
end;
readln(f);
end;
close(F);
end;


{N: nr--->nr-m;
 E: nr--->nr+1;
 S: nr--->nr+m;
 V: nr--->nr-1;}

procedure solve;
var i:integer;
curent:integer;
begin
nr:=1;
u[k]:=1;
push(k,prim,ultim);

while prim<>nil do
 begin
  pop(curent,prim,ultim);
  while lst[curent]<>nil do
   begin
    pop_list(i,lst[curent]);
    nr:=nr+1;
    u[i]:=1;
    push(i,prim,ultim);
    end;

  i:=curent-m;
  if (i>0) then
  if u[i]=0 then
   if u[a[i]]=1 then
    begin
     u[i]:=1;
     push(i,prim,ultim);
     nr:=nr+1;
    end
    else
    push_list(i,lst[a[i]]);

  i:=curent+1;
  if curent mod m<>0 then
  if u[i]=0 then
   if u[a[i]]=1 then
    begin
     u[i]:=1;
     push(i,prim,ultim);
     nr:=nr+1;
     end
   else
     push_list(i,lst[a[i]]);



  i:=curent+m;
  if i <=n*m then
  if u[i]=0 then
   if u[a[i]]=1 then
    begin
     u[i]:=1;
     push(i,prim,ultim);
     nr:=nr+1;
    end
   else
     push_list(i,lst[a[i]]);

  i:=curent-1;
  if (i>0) and( i mod m<>0) then
  if u[i]=0 then
   if u[a[i]]=1 then
    begin
     u[i]:=1;
     push(i,prim,ultim);
     nr:=nr+1;
    end
   else
     push_list(i,lst[a[i]]);
  end;
end;


begin
readdata;
solve;
assign(g,'castel.out');rewrite(g);
write(g,nr);
close(g);
end.