Cod sursa(job #181561)

Utilizator DraStiKDragos Oprica DraStiK Data 18 aprilie 2008 15:43:06
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <stdio.h>
int dx[]={-1,0,1,0,-1,1,1,-1};
int dy[]={0,1,0,-1,1,1,-1,-1};
int b[101][101],r[101][101],k[101][101];
int n,m,xr,yr,xj,yj;
void drum(int a[101][101],int x,int y)
{
	int i,j,k,step,flag = 1;
	for (i=1; i<=n; ++i)
	    for (j=1; j<=m; ++j)
	       if (b[i][j]==-1)
                a[i][j]=-1;
            else
                a[i][j]=1000000;
	a[x][y] = 1;
	for (step=1; flag; ++step)
	{
		flag=0;
		for (i=1; i<=m; ++i)
		  for (j=1; j<=m; ++j)
			if (a[i][j]==step)
			for (k=0;k<8;++k)
				if (a[i][j]+1<a[i+dx[k]][j+dy[k]])
				{
					a[i+dx[k]][j+dy[k]]=a[i][j]+1;
                    flag=1; 
                }
	}
}
void read ()
{
    int i,j;
    char ch;
    scanf ("%d%d\n",&n,&m);
    for (i=1; i<=n; ++i)
        for (j=1; j<=m+1; ++j)
        {
			scanf ("%c",&ch);
			if (ch=='\n' && j!=m+1)
			{
				ch=' ';
				++j;
			}
            switch (ch)
            {
                case ' ':b[i][j]=0;break;
				case 'X':b[i][j]=-1;break;
                case 'R':
                {
                    xr=i;
                    yr=j;
                    break;
                }
                case 'J':
                {
                    xj=i;
                    yj=j;
                    break;
				}
			}
		}
}
void solve()
{
	drum(r,xr,yr); 
    drum(k,xj,yj);
	int imin=0,jmin=0,min=1000000000,i,j;
	for (i=1; i<=n; ++i)
		for (j=1; j<=m; ++j)
			if (r[i][j]==k[i][j] && r[i][j] && r[i][j]<min)
			{
                imin=i;
                jmin=j;
                min=r[i][j];
            }
	printf ("%d %d %d",min,imin,jmin);	
}
int main ()
{
    freopen("rj.in","r",stdin);
    freopen("rj.out","w",stdout);
    read ();
    solve ();
    return 0;
}