Cod sursa(job #130038)

Utilizator ScrazyRobert Szasz Scrazy Data 30 ianuarie 2008 21:55:09
Problema Rj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <stdio.h>
#include <string.h>
#define Nmax 100
#define Mmax 100

const int di[]={-1,-1,-1,0,0,1,1,1};
const int dj[]={-1,0,1,1,-1,-1,0,1};

char a[Nmax][Mmax];
int r[Nmax][Mmax], j[Nmax][Mmax];
int x[Nmax*Mmax], y[Nmax*Mmax];
int ri,rj,ji,jj;
int n, m;

void read()
{
    freopen("rj.in","r",stdin);
    scanf("%d %d", &n, &m);
    char s[Mmax];
    fgets(s,110,stdin);
    for (int i=1; i<=n; ++i)
    {
	fgets(s,110,stdin);
	for (int j=0; j<m; ++j) 
	{
	    a[i][j+1]=s[j];
	    if (a[i][j+1]=='R')
	    {
		ri=i;rj=j+1;
		a[i][j+1]=' ';
	    }
	    if (a[i][j+1]=='J')
	    {
		ji=i;jj=j+1;
		a[i][j+1]=' ';
	    }
	}
    }
    fclose(stdin);
}
    
void sol(int m[Nmax][Mmax], int xx, int yy)
{
    memset(x,0,sizeof(x));
    memset(y,0,sizeof(y));

    int e, u;
    e=u=0;
    x[e]=xx;y[e]=yy;
    m[xx][yy]=1;

    while (e<=u)
    {
	int i=x[e], j=y[e++];
	for (int k=0; k<8; ++k)
	    if (a[i+di[k]][j+dj[k]]==' ' && (m[i+di[k]][j+dj[k]]>m[i][j]+1 || m[i+di[k]][j+dj[k]]==0))
	    {
		m[i+di[k]][j+dj[k]]=m[i][j]+1;
		x[++u]=i+di[k];
		y[u]=j+dj[k];
	    }
    }
}

void min()
{
    freopen("rj.out","w",stdout);

    int min, mini, minj;

    for (int x=1; x<=n; ++x)
	for (int y=1; y<=m; ++y)
	    if (r[x][y]==j[x][y])
		if (min>r[x][y] && r[x][y]!=0)
		{
		    min=r[x][y];
		    mini=x;minj=y;
		}

    printf("%d %d %d", min, mini, minj);

    fclose(stdout);
}

int main()
{
    read();
    sol(r, ri, rj);
    sol(j, ji, jj);
    min();
    return 0;
}