Cod sursa(job #291690)

Utilizator drag0s93Mandu Dragos drag0s93 Data 30 martie 2009 10:38:50
Problema Rj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.34 kb
#include<stdio.h>
#include<string.h>

#define IN "rj.in","r",stdin
#define OUT "rj.out","w",stdout

struct pct {
	int x,y;
};

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

pct coada[10020];
int m,n,xR,yR,xJ,yJ,pozx,pozy;
int a[120][120],b[120][120];

void citire()
{
	freopen(IN);
	scanf("%d%d ",&n,&m);
	
	char c[120];
	
	for(int i = 1; i <= n ; ++i)
	{
		fgets(c,120,stdin);
		for(int j = 0 ;j < m; ++j)
		{
			if(c[j] == 'R' || c[j] == 'J')
			{
				if(c[j] == 'R')
				{
					xR=i;
					yR=j+1;
				}
				else
				{
					xJ=i;
					yJ=j+1;
				}
				a[i][j+1] = 0;
				continue;
			}
			if(c[j] == 'X')
			{
				a[i][j+1] = -1;
				continue;
			}
			else if(c[j] == ' ')
			{
				a[i][j+1] = -3;
				continue;
			}
		}
	}
	memcpy(b,a,sizeof(a));
}

void Lee1()
{
	int i,k,T=1,sx,sy;
	
	coada[T].x = xR;
	coada[T++].y = yR;
	
	for(i = 1 ; i <= T ; ++i)
		for(k = 0 ; k < 8  ; ++k)
		{
			sx = dx[k] + coada[i].x;
			sy = dy[k] + coada[i].y;
			if(sx <= n && sx >= 1 && sy <= m && sy >= 1 && a[sx][sy] == -3 && !(a[sx][sy] == 0 || a[sx][sy] == -1))
			{
				coada[T].x = sx;
				coada[T++].y = sy;
				a[sx][sy] = a[coada[i].x][coada[i].y] + 1;
			}
			
		}
		for(int i=1;i<=T;++i)
		{
			coada[i].x=0;
			coada[i].y=0;
		}
	
	for(int i=1;i<=n;++i)
	{
		for(int j= 1;j<=m;++j)
			printf("%2d ",a[i][j]);
		printf("\n");
	}
	printf("\n");
		
}

void Lee2()
{
	int i,k,T=1,sx,sy;
	int min=20000;
	
	coada[T].x = xJ;
	coada[T++].y = yJ;
	
	for(i = 1 ; i <= T ; ++i)
		for(k = 0 ; k < 8  ; ++k)
		{
			sx = dx[k] + coada[i].x;
			sy = dy[k] + coada[i].y;
			if(sx <= n && sx >= 1 && sy <= m && sy >= 1 && b[sx][sy] == -3 && !(b[sx][sy] == 0 || b[sx][sy] == -1))
			{
				coada[T].x = sx;
				coada[T++].y = sy;
				b[sx][sy] = b[coada[i].x][coada[i].y] + 1;
			}
			
		}
		
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j)
			if(a[i][j]==b[i][j] && min>a[i][j] && a[i][j]>=0 && (i!=xR || j!=yR ) && (i!=xJ || j!=yJ))
			{
				pozx=i;
				pozy=j;
				min=a[i][j];
			}
	
	for(int i=1;i<=n;++i)
	{
		for(int j= 1;j<=m;++j)
			printf("%2d ",b[i][j]);
		printf("\n");
	}
}

void afisare()
{
	freopen(OUT);
	printf("%d %d %d \n",a[pozx][pozy] + 1,pozx,pozy);
}

int main()
{
	citire();
	Lee1();
	Lee2();
	afisare();
	return 0;
}