Cod sursa(job #304083)

Utilizator pandaemonAndrei Popescu pandaemon Data 10 aprilie 2009 20:57:15
Problema Castel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include<stdio.h>
#include<iostream.h>

#define MAX 200

int n,m,k;

int mat[MAX][MAX],used[MAX*MAX],C[MAX*MAX],i,j,cnt;

struct key { int val; key *last; } *K[MAX*MAX+2];

int decode(int valoare,int &lin,int &col)
{
  lin=(valoare-1)/m;  int var=lin*m;   lin++;  col=valoare-var;
}

int code(int &valoare,int lin,int col)
{
 valoare=(lin-1)*m; valoare+=col;
}


int add(int var,int x)
{
  key *p=new key;

  p->val=x;

  if(K[var]==NULL) { K[var]=p; p->last=NULL; return 0; }

  p->last=K[var]; K[var]=p;
}


int algoritm(int x)
{
  int var,lin,col; decode(x,lin,col);  C[x]=used[x]=1; cnt++;

  if(lin<n)
  {code(var,lin+1,col); add(mat[lin+1][col],var);
   if(C[mat[lin+1][col]]==1 && used[var]==0) algoritm(var); }

  if(col<m)
  {code(var,lin,col+1); add(mat[lin][col+1],var);
  if(C[mat[lin][col+1]]==1 && used[var]==0) algoritm(var); }

  if(col>1)
  {code(var,lin,col-1); add(mat[lin][col-1],var);
   if(C[mat[lin][col-1]]==1 && used[var]==0) algoritm(var); }

  if(lin>1)
  {code(var,lin-1,col); add(mat[lin-1][col],var);
   if(C[mat[lin-1][col]]==1 && used[var]==0) algoritm(var); }

  for(key *p=K[x]; p!=NULL; p=p->last) if(used[p->val]==0) algoritm(p->val);

}


int main()
{

  freopen("castel.in","r",stdin);
  freopen("castel.out","w",stdout);

  scanf("%d %d %d",&n,&m,&k);   // n linii, m coloane, k poz start

  for(i=1; i<=n; i++)
  for(j=1; j<=m; j++) scanf("%d",mat[i]+j);

  algoritm(k); printf("%d\n",cnt);



}