Cod sursa(job #123617)

Utilizator mithyPopovici Adrian mithy Data 16 ianuarie 2008 19:44:08
Problema Castel Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <stdio.h>
#define NMax 151
#define ZID -1
#define ND 4

int n, m, init;
int a[NMax][NMax];
int cam[NMax][NMax];
int chei[NMax];
int viz[NMax];

int in, sf;
int dx[] = {-1,0,1,0};
int dy[] = {0,1,0,-1};
struct point{ int x, y; };
point start, C[NMax*NMax], aux;

FILE *f, *g;

void citire();
void rez();

int main()
{
	citire();
	rez();
	return 0;
}
void rez()
{
	int i, ok;

	in = sf = 0;
	C[in] = start;

	chei[cam[start.x][start.y]] = 1;
	viz[cam[start.x][start.y]] = 1;

	while ( 1 )
	{
		ok = 0;
		for (i=in; i<=sf && !ok ; i++)
			if ( chei[a[C[i].x][C[i].y]] )
				ok = 1;

		if ( !ok )
			break;
	
		aux = C[in++];

		if ( !chei[a[aux.x][aux.y]] )
		{
			sf++;
			C[sf] = aux;
			continue;
		}
		else
		{
			viz[cam[aux.x][aux.y]] = 1;
			chei[cam[aux.x][aux.y]] = 1;
		}

		for (i=0; i<ND; i++)
		if ( a[aux.x+dx[i]][aux.y+dy[i]] != ZID && !viz[cam[aux.x+dx[i]][aux.y+dy[i]]] )
		{
			sf++;
			C[sf].x = aux.x+dx[i];
			C[sf].y = aux.y+dy[i];
		}

	}

	for (i=0, ok=0; i<=n*m; i++)
		if ( viz[i] )
			ok++;

	fprintf( g, "%d\n", ok );
}
void citire()
{
	int i, j, camAux = 1;
	f = fopen( "castel.in", "rt" );
	g = fopen( "castel.out", "wt" );

	fscanf( f, "%d %d %d", &n, &m, &init );
	for (i=1; i<=n; i++)
	for (j=1; j<=m; j++)
	{
		fscanf( f, "%d", &a[i][j] );
		if ( camAux == init )
		{
			start.x = i;
			start.y = j;
		}

		cam[i][j] = camAux++;
	}

	for (i=0; i<=n+1; i++)
		a[i][0] = a[i][m+1] = ZID;
	for (i=0; i<=m+1; i++)
		a[0][i] = a[n+1][i] = ZID;
}