Cod sursa(job #720900)

Utilizator valiro21Valentin Rosca valiro21 Data 23 martie 2012 00:47:06
Problema Castel Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <cstdio>
#include <list>
#define NMax 201

using namespace std;


struct Room{
	int x,y,val,room;
	bool viz;
} *rm[NMax*NMax],ve[NMax][NMax];
list<Room> q;
bool key[NMax*NMax],erase,ok=1;
int tot,dx[4]={-1,0,1,0},dy[4]={0,1,0,-1},start,mini,minj,camera,x,y,n,m;

void lee(int xi,int yi){
	q.push_back(ve[xi][yi]);
	ve[xi][yi].viz=1;
	key[start]=1;
	erase=0;
	while(!q.empty() && ok){
		ok=0;
		erase=0;
		for(list<Room>::iterator it=q.begin();it!=q.end();it++){
			if(erase)
				erase=0,it--;

			if(key[it->val]){
				key[it->room]=1,tot++;
				erase=1,ok=1;

				for(long i=0;i<4;i++){
					x=it->x+dx[i];
					y=it->y+dy[i];
					if((1<=x && x<=n) && (1<=y && y<=m) && !ve[x][y].viz){
						q.push_back(*rm[ve[x][y].room]);
						ve[x][y].viz=1;
					}
				}

				it=q.erase(it);
			}

		}
	}
}

int main()
{
	freopen("castel.in","rt",stdin);
	freopen("castel.out","wt",stdout);

	scanf("%ld %ld %ld",&n,&m,&start);
	for(long i=1;i<=n;i++){
		for(long j=1;j<=m;j++){
			camera++;
			scanf("%ld",&ve[i][j].val);ve[i][j].room=camera,ve[i][j].x=i,ve[i][j].y=j;
			rm[camera]=&ve[i][j];
			if(camera==start)
				mini=i,minj=j;
		}
	}

	lee(mini,minj);

	printf("%ld",tot);

	return 0;
}