Cod sursa(job #158875)

Utilizator andr33aradu ioana andr33a Data 13 martie 2008 20:48:10
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include<fstream.h>
#include<string.h>
ifstream f("rj.in");
ofstream g("rj.out");
int r[110][110],j[110][110],i,k,m,n,r1,r2,j1,j2,min=32000,d[2][4]={{0,-1,0,1},{-1,0,1,0}};
char *p,s[201];
void coadar()
{
	int c[2][15000],i,p,u,x,y;
	c[0][0]=r1;
	c[1][0]=r2;
	p=0;u=0;
	while(p<=u)
	{
		x=c[0][p];
		y=c[1][p];
		for(i=0;i<=3;i++)
		{
			if(r[x+d[0][i]][y+d[1][i]]==0)
			{
				r[x+d[0][i]][y+d[1][i]]=r[x][y]+1;
				c[0][++u]=x+d[0][i];
				c[1][u]=y+d[1][i];
			}
		}
		p++;
	}
}
void coadaj()
{
	int c[2][15000],i,p,u,x,y;
	c[0][0]=j1;
	c[1][0]=j2;
	p=0;u=0;
	while(p<=u)
	{
		x=c[0][p];
		y=c[1][p];
		for(i=0;i<=3;i++)
		{
			if(j[x+d[0][i]][y+d[1][i]]==0)
			{
				j[x+d[0][i]][y+d[1][i]]=j[x][y]+1;
				c[0][++u]=x+d[0][i];
				c[1][u]=y+d[1][i];
			}
		}
		p++;
	}
}
void verificare()
{
	int x,y;
	for(int i=1;i<=n;i++)
		for(int k=1;k<=m;k++)
			if(r[i][k]==j[i][k]&&r[i][k]<min&&r[i][k]!=-1&&r[i][k]!=0)
			{
				min=r[i][k];
				x=i;
				y=k;
			}
	g<<min-1<<" "<<x<<" "<<y;
}
int main()
{
	f>>n>>m;
	f.get();
	for(i=1;i<=n;i++)
	{
		f.getline(s,200);
		p=strchr(s,'R');
		if(p)
		{
			r[i][p-s+1]=1;
			r1=i;
			r2=p-s+1;
		}
		p=strchr(s,'J');
		if(p)
		{
			j[i][p-s+1]=1;
			j1=i;
			j2=p-s+1;
		}
		p=strchr(s,'X');
		while(p)
		{
			r[i][p-s+1]=-1;
			j[i][p-s+1]=-1;
			p++;
			p=strchr(p,'X');
		}
	}
	for(i=0;i<=n+1;i++)
	{
		r[i][0]=1;
		r[i][m+1]=1;
		j[i][0]=1;
		j[i][m+1]=1;
	}
	for(k=0;k<=m+1;k++)
	{
		r[0][k]=1;
		r[n+1][k]=1;
		j[0][k]=1;
		j[n+1][k]=1;
	}
	coadar();
	coadaj();
	verificare();
f.close();
g.close();
return 0;
}