Cod sursa(job #721129)

Utilizator valiro21Valentin Rosca valiro21 Data 23 martie 2012 12:31:07
Problema Castel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <cstdio>
#include <queue>
#define NMax 201

using namespace std;


struct Room{
	short x,y,val;
} room[NMax * NMax];

queue<int> q , lst[NMax * NMax];
bool viz[NMax * NMax];
short dx[4]={-1,0,1,0},dy[4]={0,1,0,-1},ve[NMax][NMax];
short x,y,n,m,start,mini,minj,camera,curr,now,tot;

void lee(int xi,int yi){
	q.push(ve[xi][yi]);
	viz[start]=1;

	while(!q.empty())
	{
		now=q.front();
		while(!lst[now].empty())
		{
			curr=lst[now].front();
			if(viz[curr]==0){
				viz[curr]=1;
				q.push(curr);
			}
			lst[now].pop();
		}

		for(long i=0;i<4;i++){
			x=room[now].x+dx[i];
			y=room[now].y+dy[i];
			if((1<=x && x<=n) && (1<=y && y<=m) && !viz[ve[x][y]] )
				if(viz[room[ve[x][y]].val])
					q.push(ve[x][y]),viz[ve[x][y]]=1;
				else
					lst[room[ve[x][y]].val].push(ve[x][y]);

			}

		tot++;
		q.pop();
		}
}

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++){
			scanf("%ld",&x);ve[i][j]=++camera;
			room[camera].x=i;room[camera].y=j;room[camera].val=x;
			if(camera==start) mini=i,minj=j;
		}
	}

	lee(mini,minj);

	printf("%ld\n",tot);

	return 0;
}