Cod sursa(job #574938)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 7 aprilie 2011 18:28:59
Problema Castel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include<stdio.h>
#include<vector>
using namespace std;
#define Dim 155

FILE*f=fopen("castel.in","r");
FILE*g=fopen("castel.out","w");

int n,m,k,i,j,Nec[Dim*Dim],C[Dim*Dim];
char Viz[Dim*Dim],Used[Dim*Dim];
int p,u,x,c,r;

vector<int>F[Dim*Dim];

int main () {
	fscanf(f,"%d %d %d",&n,&m,&k);
	
	
	for ( i = 1 ; i <= n ; ++i ){
		for ( j = 1 ; j <= m ; ++j ){
			fscanf(f,"%d",&x);
			Nec[(i-1)*m+j] = x;
		}
	}
	
	for ( p = u = 1, C[1] = k , Viz[k] = 1 ; p <= u ; ++p ){
		c = C[p];
		for ( i = 0 ; i < F[c].size() ; ++i ){
			r = F[c][i];
			if ( !Viz[r]  ){
				Viz[r] = 1;
				C[++u] = r;
			}
		}
		if ( c > m ){
			if ( !Viz[c-m] ){
				if ( Viz[Nec[c-m]] ){
					C[++u] = c-m;
					Viz[c-m] = 1;
				}
				else
					F[Nec[c-m]].push_back(c-m);
			}
		}
		if ( ( c - 1 ) % m ){
			if ( !Viz[c-1] ){
				if ( Viz[Nec[c-1]] ){
					C[++u] = c-1;
					Viz[c-1] = 1;
				}
				else
					F[Nec[c-1]].push_back(c-1);
			}
		}
		if ( c % m ){
			if ( !Viz[c+1] ){
				if ( Viz[Nec[c+1]] ){
					C[++u] = c + 1;
					Viz[c+1] = 1;
				}
				else
					F[Nec[c+1]].push_back(c+1);
			}
		}
		if ( c <= ( n - 1 ) * m ){
			if ( !Viz[c+m] ){
				if ( Viz[Nec[c+m]] ){
					C[++u] = c + m;
					Viz[c+m] = 1;
				}
				else
					F[Nec[c+m]].push_back(c+m);
			}
		}
	}
	
	fprintf(g,"%d\n",u);
	
	fclose(f);
	fclose(g);
	
	return 0;
}