Cod sursa(job #1164692)

Utilizator HashiraGrigore Vlad Hashira Data 2 aprilie 2014 11:32:06
Problema Castel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <cstdio>
#include <queue>

#define inside(x,y) (x>=1 && x<=n && y>=1 && y<=m)
#define room(x,y) ((x-1)*m+y)

using namespace std;

int n,m,k;

int keys[155][155];
bool akeys[23000];
bool viz[155][155];

int dx[]={-1, 0, 1, 0},
	dy[]={ 0, 1, 0,-1};

struct POINT
{
	int x,y;
};

queue<POINT> q;

inline void roomn(int x,int *i,int *j)
{
	*i=x/m+1;
	*j=x%m;
	if(*j==0)
	{
		(*i)--;
		*j=m;
	}
}

void solve()
{
	POINT tata,fiu;
	roomn(k,&tata.x,&tata.y);
	akeys[k]=true;

	q.push(tata);

	int l;

	while(!q.empty())
	{
		tata=q.front();
		q.pop();

		for(l=0;l<4;++l)
		{
			fiu.x=tata.x+dx[l];
			fiu.y=tata.y+dy[l];

			if(!inside(fiu.x,fiu.y))
				continue;

			if(viz[fiu.x][fiu.y])
				continue;

			if(akeys[keys[fiu.x][fiu.y]])
			{
				akeys[room(fiu.x,fiu.y)]=true;
				viz[fiu.x][fiu.y]=true;
			}

			if(akeys[room(tata.x,tata.y)])
				q.push(fiu);
		}
	}
}

int main()
{
    freopen("castel.in","r",stdin);
    freopen("castel.out","w",stdout);

    scanf("%d%d%d",&n,&m,&k);

	int i,j;
	for(i=1;i<=n;++i)
		for(j=1;j<=m;++j)
			scanf("%d",&keys[i][j]);

	solve();

	int x=0;
	for(i=1;i<=n;++i)
		for(j=1;j<=m;++j)
			x+=viz[i][j];

	printf("%d",x);

    return 0;
}