Cod sursa(job #579978)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 12 aprilie 2011 17:10:31
Problema Castel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
# include <stdio.h>
struct poz {
	short i, j;
};
poz in;
const int dx[] = {1, 0,-1,  0};
const int dy[] = {0, 1, 0, -1};
int n, m, k, i, j, sol;
short key[151 * 151];
poz Q[151 * 151];
short a[151][151], b[151][151];
void make (){
	int ok = 1, dr = 1;
	Q[1] = in;
	key[k] = 1;
	while (ok){
		ok = 0;
		for (int st = 1; st <= dr; ++st){
			poz ret = Q[st];
			for (int k = 0; k < 4; ++k){
				poz acm = ret;
				acm.i += dx[k];
				acm.j += dy[k];
				if (!b[acm.i][acm.j] && key[a[acm.i][acm.j]]){
					b[acm.i][acm.j] = 1;
					Q[++dr] = acm;
					key[ (acm.i - 1) * m + acm.j ] = 1;
					ok = 1;
				}
			}
		}
	}
}
int main (){
	freopen ("castel.in", "r", stdin);
	freopen ("castel.out", "w", stdout);
	scanf ("%d%d%d", &n, &m, &k);
    in.i = k / m;
	in.j = k % m;
	if (in.j){
		++in.i;
	}
	else{
		in.j = m;
	}
	for (i = 1; i <= n; ++i)
		for (j = 1; j <= m; ++j){
			scanf ("%hd", &a[i][j]);
		}
	b[in.i][in.j] = 1;
	make ();
	for (i = 1; i <= n; ++i)
		for (j = 1; j <= m; ++j)
			sol += b[i][j];
	printf ("%d\n", sol);
	return 0;
}