Cod sursa(job #281013)

Utilizator cristiprgPrigoana Cristian cristiprg Data 13 martie 2009 18:35:15
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.31 kb
#include <cstdio>
#define DIM 105
#define INF 32000

int a[DIM][DIM], b[DIM][DIM], n, m, ri, rj, ji, jj;
FILE *out = fopen("rj.out", "w");

int abs(int x)
{
	return (x>0 ? x : -x);
}

void citire()
{
	FILE *f = fopen("rj.in", "r");
	fscanf(f, "%d%d", &n, &m);
	char c;
	fscanf(f, "%c", &c);//n
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			fscanf(f, "%c", &c);
			if (c == 'R')
				ri = i, rj = j;

			if (c == 'J')
				ji = i, jj = j;

			if (c == ' ')
				a[i][j] = 0;

			if (c == 'X')
				a[i][j] = 1;

			b[i][j] = INF;
		}
		fscanf(f, "%c", &c);
	}

	fclose(f);
}

void afis()
{
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
			if (b[i][j] != INF)
				fprintf(out, "%3d", b[i][j]);
			else
				fprintf (out, "  X");

		fprintf(out, "\n");
	}

}


int OK(int i, int j)
{
	if (i < 1 || i > n || j < 1 || j > m)
		return 0;

	if (a[i][j] == 1)
		return 0;

	if (b[i][j] != INF)
		return 0;

	return 1;
}


void lee()
{
	int *coadai, *coadaj;
	coadai = new int [n*m];
	coadaj = new int [n*m];
	int st, dr, i, j, im ,jm;
	const int vi[] = {-1, -1, -1, 0, 1, 1, 1, 0},
			  vj[] = {-1,  0,  1, 1, 1, 0,-1,-1};
	st = 1;
	dr = 2;
	coadai[1] = ri;
	coadaj[1] = rj;
	coadai[2] = ji;
	coadaj[2] = jj;
	b[ri][rj] =  1;
	b[ji][jj] = -1;
	while(st <= dr)
	{
		i = coadai[st];
		j = coadaj[st];
		for (int d = 0; d < 8; d++)
		{
			im = i + vi[d];
			jm = j + vj[d];
/*			if (b[im][jm] == -b[i][j] - 1 && b[i][j] <0)

			{fprintf(out, "%d %d %d\n", abs(b[i][j]-1) , i, j);
				 printf("0");
				 return;}
*/

			if(b[im][jm] == -b[i][j] + 1 && b[im][jm] < 0)
				{fprintf(out, "%d %d %d\n", abs(b[im][jm]-1) , i, j);
				 printf("1");
				 return;}

			if (b[im][jm] == -b[i][j] )
				{fprintf(out, "%d ", abs(b[im][jm])+1);
				if (j < jm)
					fprintf(out, "%d %d\n", i, j);
				else
					fprintf(out, "%d %d\n", im, jm);

				printf("2");
				 return;}

			if (OK(im, jm))
			{
				if (b[i][j] > 0)
					b[im][jm] = b[i][j] + 1 ;
				else
					b[im][jm] = b[i][j] - 1 ;

				//afis();
				//fprintf(out, "\n||-----------||\n");
				dr++;
				coadai[dr] = im;
				coadaj[dr] = jm;
			}
		}

		st++;
	}


}


int main ()
{
	citire();

	lee();
	afis();

	fclose(out);
	return 0;
}