Cod sursa(job #271676)

Utilizator razyelxrazyelx razyelx Data 5 martie 2009 19:44:26
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <fstream.h>
#include <string.h>
#define max 102
ifstream in("rj.in");
ofstream out("rj.out");

int n,m,tr[max][max],tj[max][max];
char t[max][max];

struct poz{int x,y;} r,ju;

int x[9]={0,1,1,1,0,0,-1,-1,-1};
int y[9]={0,-1,0,1,-1,1,-1,0,1};

void citire(){
     int i,j;
     char x;

     in>>n>>m;
     in.get();
     for(i=1;i<=n;++i){
	in.getline(t[i],101);
	for(j=1;j<=m;++j){

	   if(t[i][j-1] == 'X') tr[i][j] = tj[i][j] = -1;
	   if(t[i][j-1] == 'R'){r.x = i;r.y=j;}
	   if(t[i][j-1] == 'J'){ju.x = i;ju.y=j;}
	}
     }
}
void bordare(){
     int i,j;
     for(j=0;j<=n+1;++j)
	tr[n+1][j] = tr[0][j] = tj[n+1][j] = tj[0][j] = -1;
     for(i=0;i<=n+1;++i)
	tr[i][n+1] = tr[i][0] = tj[i][n+1] = tj[i][0] = -1;
}
void traseu_r(){
     int i,j,k,l;
     tr[r.x][r.y] = 1;
     for(k=1;k<=n;++k)
	for(i=1;i<=n;++i)
	   for(j=1;j<=n;++j)
	      if(tr[i][j] != 0 && tr[i][j] != -1)
		for(l=1;l<=8;++l)
		     if(tr[i+x[l]][j+y[l]] != -1)
		       if(tr[i+x[l]][j+y[l]] > tr[i][j]+1 || tr[i+x[l]][j+y[l]] == 0)
			tr[i+x[l]][j+y[l]] = tr[i][j]+1;
}
void traseu_j(){
     int i,j,k,l;
     tj[ju.x][ju.y] = 1;
     for(k=1;k<=n;++k)
	for(i=1;i<=n;++i)
	   for(j=1;j<=n;++j)
	      if(tj[i][j] != 0 && tj[i][j] != -1)
		for(l=1;l<=8;++l)
		     if(tj[i+x[l]][j+y[l]] != -1)
		       if(tj[i+x[l]][j+y[l]] > tj[i][j]+1 || tj[i+x[l]][j+y[l]] == 0)
			tj[i+x[l]][j+y[l]] = tj[i][j]+1;
}
void afisare(){
     int i,j,ok=0;
     for(i=1;i<=n && !ok;++i){
	for(j=1;j<=n && !ok;++j)
	   if(tr[i][j] == tj[i][j] && tr[i][j]!=-1 && tr[i][j] !=0){
	     ok=1;
	     out<<tr[i][j]<<" "<<i<<" "<<j;
	   }
     }
}
int main(){
    citire();
    bordare();
    traseu_r();
    traseu_j();
    afisare();
    return 0;
}