Cod sursa(job #575133)

Utilizator stay_awake77Cangea Catalina stay_awake77 Data 7 aprilie 2011 22:41:28
Problema Castel Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include<stdio.h>
#define DMAX 152
#define LMAX 50001

typedef struct { int x; int y; } Queue;

int M, N, K, i, j, A[DMAX][DMAX], Nr, xi, yi, xii, yii;
int dx[]={-1,0,1,0}, dy[]={0,1,0,-1};
bool IN[DMAX][DMAX], Key[DMAX][DMAX];
Queue Q[LMAX];

void Lee()
{
	int dr = 0, ii, jj, xc, yc;
	bool acces = true;

	Q[0].x = K/M; 
	if( (K%M) ) ++Q[0].x;

	Q[0].y = K%M;
	if( !Q[0].y ) Q[0].y = M;

	while( acces )
	{
		acces = false;
		
		for( jj=0; jj<=dr; jj++ )
		{
			xc = Q[jj].x; yc = Q[jj].y;

			for( ii=0; ii<4; ii++ )
				if( xc+dx[ii]>0 && xc+dx[ii]<=N && yc+dy[ii]>0 && yc+dy[ii]<=M )
				{
					int lin = A[xc+dx[ii]][yc+dy[ii]]/M;
					if( (A[xc+dx[ii]][yc+dy[ii]]%M) ) ++lin;

					int col = A[xc+dx[ii]][yc+dy[ii]]%M;
					if( !col ) col = M;

					if( !IN[xc+dx[ii]][yc+dy[ii]] && Key[lin][col] )
					{
						++dr;
						Q[dr].x = xc+dx[ii];
						Q[dr].y = yc+dy[ii];
						Key[xc+dx[ii]][yc+dy[ii]] = true;
						IN[xc+dx[ii]][yc+dy[ii]] = true;

						acces = true;
						++Nr;
					}
				}
		}
	}
}

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

	scanf("%d%d%d", &N, &M, &K);
	for( i=1; i<=N; i++ )
		for( j=1; j<=M; j++ )
			scanf("%d", &A[i][j]);

	Nr = 1;
	xi = K/M; 
	if( (K%M) ) ++xi;
	yi = K%M;
	if( !yi ) yi = M;
	IN[xi][yi] = true;
	Key[xi][yi] = true;

	Lee();

	printf("%d\n", Nr);

	return 0;
}