Cod sursa(job #820130)

Utilizator crisjonycristi crisjony Data 20 noiembrie 2012 09:05:41
Problema Castel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include<stdio.h>

FILE *fin,*fout;

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

void citire()
{
	int p, i, j;
	fin = fopen("castel.in", "r");
	fscanf(fin, "%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(fin, "%d", &A[i][j]);
	fclose(fin);
}


void prel()
{
	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 afisare()
{
	fout=fopen("castel.out", "w");
	fprintf(fout, "%d\n", nr);
	fclose(fout);
}

int main()
{
	citire();
	prel();
	afisare();
	return 0;
}