Cod sursa(job #70478)

Utilizator gurneySachelarie Bogdan gurney Data 6 iulie 2007 00:57:28
Problema Castel Scor 100
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.77 kb
program castel;
  const
    fin='castel.in';
    fout='castel.out';
    nmax=153;
type
  list=^elem;
  elem=record
     urm:list;
     x:longint;
     end;

var
  lst:array[0..nmax*nmax] of list;
  cap,ult,q,p:list;
  acc,viz:array[0..nmax*nmax] of boolean;
  num,i,j,n,m,x,y,k,ii,jj:longint;

procedure cod_coord(var cod,x,y:longint);
  begin
    x:=(cod-1) div n+1;
    y:=(cod-1) mod n+1;
  end;

procedure coord_cod(var cod,x,y:longint);
  begin
    if (x*y<>0) and ((x<=m) and (y<=n)) then
      cod:=(x-1)*n+y
    else
      cod:=0;
  end;

procedure insert_coada(x:longint);
  var
    aux:list;
  begin
    new(aux);
    ult^.x:=x;
    viz[x]:=true;
    ult^.urm:=aux;
    aux^.urm:=nil;
    ult:=aux;
  end;

procedure extend_key(cod:longint);
  var
    p,q:list;
    i,j,ii,jj,x:longint;
  begin
    q:=lst[cod]^.urm;
    while q<>nil do
      begin
        acc[q^.x]:=true;
        cod_coord(q^.x,i,j);
        ii:=i+1;
        if viz[q^.x]=false then
        begin
        coord_cod(x,ii,j);
        if viz[x] then
          insert_coada(q^.x);
        ii:=i-1;
        coord_cod(x,ii,j);
        if viz[x] then
          insert_coada(q^.x);
        jj:=j+1;
        coord_cod(x,i,jj);
        if viz[x] then
          insert_coada(q^.x);
        jj:=j-1;
        coord_cod(x,i,jj);
        if viz[x] then
          insert_coada(q^.x);
        end;
        q:=q^.urm;
      end;
  end;

procedure insert(key,room:longint);
  var
    aux:list;
  begin
    new(aux);
    aux^.x:=room;
    aux^.urm:=lst[key]^.urm;
    lst[key]^.urm:=aux;
  end;

begin
  assign(input,fin);
    reset(input);
    readln(m,n,k);
    for i:=1 to m*n do
      begin
        new(lst[i]);
        lst[i]^.urm:=nil;
      end;
    y:=0;
    for i:=1 to m do
      for j:=1 to n do
        begin
          inc(y);
          read(x);
          insert(x,y);
        end;
  close(input);
  assign(output,fout);
    rewrite(output);
    viz[k]:=true;
    new(cap);new(ult);cap^.urm:=ult;ult^.urm:=nil;
    cap^.x:=k;
    p:=cap;
    while p<>ult do
      begin
        extend_key(p^.x);
        cod_coord(p^.x,i,j);
        ii:=i+1;
        coord_cod(x,ii,j);
        if (acc[x])and(viz[x]=false) then
          insert_coada(x);
        ii:=i-1;
        coord_cod(x,ii,j);
        if (acc[x])and(viz[x]=false) then
          insert_coada(x);
        jj:=j-1;
        coord_cod(x,i,jj);
        if (acc[x])and(viz[x]=false) then
          insert_coada(x);
        jj:=j+1;
        coord_cod(x,i,jj);
        if (acc[x])and(viz[x]=false) then
          insert_coada(x);
        p:=p^.urm;
      end;
    num:=0;
    for i:=1 to m*n do
      if viz[i] then
        inc(num);
    writeln(num);
  close(output);
end.