Cod sursa(job #286944)

Utilizator zalmanDanci Emanuel Sebastian zalman Data 24 martie 2009 12:44:32
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
// romeo si julieta, infoarena, 24.03.09
#include <stdio.h>
#include <string.h>
#include <values.h>
#define NMAX 102
int romeo[NMAX][NMAX], juliet[NMAX][NMAX], xr, yr, xj, yj, n, m;
int dl[] = {-1, -1, -1, 0, 1, 1, 1, 0};
int dc[] = {-1, 0, 1, 1, 1, 0, -1, -1};
char s[NMAX], ch;
void print(void);
void read(void)
{
 freopen("rj.in", "r", stdin);

 scanf("%d %d", &n, &m);
 scanf("%c", &ch);
 for(register int i = 1; i <= n; i++)
 {
  gets(s);
  for(register int k = 0; k < m; k++)
	{
	 if(s[k] == 'X')
		romeo[i][k + 1] = juliet[i][k+1] = -1;
	  else
		if(s[k] == 'R')
		 {
		  xr = i;
		  yr = k + 1;
		 }
		else
		 if(s[k] == 'J')
		 {
		  xj = i;
		  yj = k + 1;
		 }
	 }
  }
	fclose(stdin);

}
void mark(void)
{
 for(register int i = 0; i <= n+1; i++)
	romeo[i][0] = juliet[i][0] = romeo[i][m+1] = juliet[i][m+1] = -2;
 for(register int j = 0; j <= m+1; j++)
	romeo[0][i] = juliet[0][i] = romeo[n+1][i] = juliet[n+1][i] = -2;
}
int inside(int x, int y)
{
 if(x == 0 || y == 0)
  return 0;
 if(x == n + 1)
  return 0;
 if(y == m + 1)
  return 0;

 return 1;

}
void lee(int a[][NMAX], unsigned int x, unsigned y)
{
 int i, j, k, li, ci, sw = 1;
 a[x][y] = 1;
 while(sw)
 for(i = 1; i <= n; i++)
  {
	sw = 0;
	for(j = 1; j <= m; j++)
		if( (a[i][j] != -1) && (a[i][j] != 0))
		 for(k = 0; k < 8; k++)
		 {
		  li = i + dl[k];
		  ci = j + dc[k];
		  //if(inside(li, ci))
		  if(a[li][ci] != -2)
			if(a[li][ci] > a[i][j] + 1 || a[li][ci] == 0)
			 {
			  a[li][ci] = a[i][j] + 1;
			  sw = 1;
			 }
		  }
  }

}
void print(void)
{
 freopen("rj.out", "w", stdout);
 int min , x, y;
 min = x = y = MAXINT;
 for(register int i = 1; i <= n; i++)
  for(register int j = 1; j <= m; j++)
  if((romeo[i][j] == juliet[i][j]) && (romeo[i][j] != -1) && (romeo[i][j]))
	  if(romeo[i][j] < min)
		{
		 min = romeo[i][j];
		 x = i;
		 y = j;
		}

  printf("%d %d %d\n", min, x, y);
  fclose(stdout);
}

void solve(void)
{
 mark();
 lee(romeo, xr, yr);
 lee(juliet, xj, yj);
}

int main(void)
{

 read();
 solve();
 print();

 return 0;
}