Cod sursa(job #57219)

Utilizator Darth_NiculusIvan Nicolae Darth_Niculus Data 1 mai 2007 13:57:12
Problema Castel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
/* Ivan Nicolae - Bucuresti */
/* Problema Castel - ONI 2007 - cls. X - solutia cu BF */
#include <stdio.h>

#define NMAX 151
#define MMAx 151
#define _fin  "castel.in"
#define _fout "castel.out"

int i,j,n,m,A[NMAX][NMAX],c,k;
int c_x[NMAX*NMAX],c_y[NMAX*NMAX], Q[NMAX*NMAX];
int dx[] = {-1,+0,-0,+1};
int dy[] = {+0,-1,+1,-0};

void mem_set(int A[], int n, int ce)
{
 for (int i=0;i<=n;i++)
    A[i]=ce;
}

int getX(int k)
{
 int x;
 x=(k / m)+1;
 if (!(k % m))
   x--;
 return x;
}

int getY(int k)
{
 int y;
 y=k-((getX(k)-1)*m);
 return y;
}

int getVal(int x, int y)
{
 int rez;
 rez=(x-1)*m+y;
 return rez;
}

void ReadData(void)
{
 int i,j;
 freopen(_fin,"r",stdin);
 scanf("%d%d%d",&n,&m,&k);
 for (i=1;i<=n;i++)
 for (j=1;j<=m;j++)
    scanf("%d",&A[i][j]);
 fclose(stdin);
}

int Okay(int x, int y)
{
 if (x<1 || y<1 || x>n || y>m)
   return 0;
 if (Q[getVal(x,y)])
   return 0;
 if (!Q[A[x][y]])
   return 0;
 return 1;
}

void Solve(void)
{
 int i,j;
 mem_set(Q,(NMAX*NMAX),0); c=0;
 c_x[++c]=getX(k); c_y[c]=getY(k); Q[k]=1;
 int nou=1;
 while (nou)
      {
       nou=0;
       for (i=1;i<=c;i++)
	  {
	   int x=c_x[i],y=c_y[i];
	   for (j=0;j<=3;j++)
	      {
	       int xx=x+dx[j], yy=y+dy[j];
	       if (Okay(xx,yy))
		 {
		  Q[getVal(xx,yy)]=1;
		  c_x[++c]=xx; c_y[c]=yy;
		  nou++;
		 }
	      }
	  }
      }
}

void PrintData(void)
{
 freopen(_fout,"w",stdout);
 printf("%d",c);
 fclose(stdin);
}

int main(void)
{
 ReadData();
 Solve();
 PrintData();
 return 0;
}