Cod sursa(job #577110)

Utilizator balakraz94abcd efgh balakraz94 Data 9 aprilie 2011 19:06:57
Problema Rj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include<fstream>
#define L 102
using namespace std;

void initializare();
void citeste();
void rezolva();
void lee(int a[L][L], int, int);


int m,n;
int ro[L][L],ju[L][L];
int xri,yri,xji,yji;

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

struct coada {int x,y;};
coada c[L*L];





void initializare()
{
	for(int i=0;i<L;i++) 
		for(int j=0;j<L;j++) 
			ro[i][j]=ju[i][j]=-2;

}




void citeste()
{
	char s[L+2];
	int i,j;
	
	ifstream fin ("rj.in");
	
	fin>>m>>n;
	fin.get();
	
	for(i=1;i<=m;i++) 
	{
		fin.getline(s,102);
		for( j=0;j<n;j++) 
		{ 
			if(s[j]=='X') ro[i][j+1]=ju[i][j+1]=-1;
			  else if(s[j]=='R') {xri=i;yri=j+1;}
					 else if (s[j]=='J') {xji=i;yji=j+1;}
		}
	j=1;	
	}
	
	fin.close();
	
	
	for(i=0;i<=m+1;i++) ro[i][0]=ro[i][n+1]=ju[i][0]=ju[i][n+1]=-1;//bordare verticala
	for(i=0;i<=n+1;i++) ro[0][i]=ro[m+1][i]=ju[0][i]=ju[m+1][i]=-1;//bordare orizontala
	

}




void rezolva()
{
	lee(ro,xri,yri);
	lee(ju,xji,yji);

	int min=L*L+1;
	int iaux,jaux;
	
	for(int i=1;i<=m;i++)
		for(int j=1;j<=n+1;j++) 
			if(ro[i][j]==ju[i][j] && ro[i][j]>0)
				if(ro[i][j]<min) {min=ro[i][j];iaux=i;jaux=j;}

	ofstream fout("rj.out");
	
	fout<<min+1<<" "<<iaux<<" "<<jaux;
	
	fout.close();
			
}



void lee(int a[L][L],int xi,int yi)
{
	int xc,yc,mc,x2,y2,i;
    int p,u;
	
	p=u=1;
	c[p].x=xi;
	c[p].y=yi;
	a[xi][yi]=0;
	
	while(p<=u)
	{
		xc=c[p].x;
		yc=c[p].y;
		mc=a[xc][yc];
		
		for(i=1;i<=8;i++) 
		{
			x2=xc+dx[i];
			y2=yc+dy[i];
			
			if(a[x2][y2]==-2)
			{
				u++;
				c[u].x=x2;
				c[u].y=y2;
				a[x2][y2]=mc+1;
			}
		}
		p++;
	}
}


	













int main()
{
	initializare();
	citeste();
	rezolva();
	
	return 0;
}