Cod sursa(job #765500)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 7 iulie 2012 22:47:51
Problema Castel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include<stdio.h>

#define NMAX 152
#define QMAX 30000

int A[ NMAX ][ NMAX ], K[ NMAX * NMAX ], B[ NMAX ][ NMAX ], v[ QMAX ][2], d[4][2], n, m, xi, yi, nr = 1;

void read()
{
	int p, i, j;
	FILE *f = fopen("castel.in", "r");
	fscanf(f, "%d %d %d", &n, &m, &p);
	yi = p % m;
	xi = p / m;
	if(yi)
		xi++;
	else
		yi = m;
	for(i = 1; i <= n; i++)
		for(j = 1; j <= m; j++)
			fscanf(f, "%d", &A[i][j]);
	fclose(f);
}


void solve()
{
	int x, y, k = 0, ok = 1, i, x1, y1, key, q = 1;

	d[0][0] = 1, d[1][0] = -1, d[2][1] = 1, d[3][1] = -1;
	
	B[xi][yi] = K[ A[xi][yi] ] = 1, v[k][0] = xi, v[k][1] = yi;
	
	while(ok)
	{
		ok = 0;
		for(q = 0 ; q <= k; q++)
		{
			x = v[q][0], y = v[q][1];
			for(i = 0; i <= 3; i++)
			{
				x1 = x + d[i][0], y1 = y + d[i][1];
				if(K[ A[x1][y1] ])
				{
					if(!B[x1][y1])
					{
						k++, v[k][0] = x1, v[k][1] = y1;
						key = (x1 - 1) * m + y1;
						ok = B[x1][y1] = K[ key ] = 1, nr++;
					}
				}
			}
		}
	}

}

void write()
{
	FILE *g = fopen("castel.out", "w");
	fprintf(g, "%d\n", nr);
	fclose(g);
}

int main()
{
	read();
	solve();
	write();
	return 0;
}