Cod sursa(job #513812)

Utilizator titusuTitus C titusu Data 16 decembrie 2010 23:43:05
Problema Rj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <iostream>
#include <iomanip>
#include <fstream>
#include <queue>
using namespace std;

ifstream fin("rj.in");
ofstream fout("rj.out");

int n,m,R[101][101],J[101][101],iR,jR,iJ,jJ;
int di[]={-1,-1,-1, 0, 0, 1, 1, 1},
	dj[]={-1, 0, 1,-1, 1,-1, 0, 1};

void Afis(int a[][101]){
	for(int i=1;i<=n;++i){
		for(int j=1;j<=m;++j)
			cout<<setw(3)<<a[i][j];
		cout<<endl;
	}
	cout<<endl;
}

void fill(int a[][101],int iS,int jS){
	queue<pair<int,int> > Q;
	a[iS][jS]=1;
	Q.push(make_pair(iS,jS));
	while(!Q.empty()){
		int i=Q.front().first, j=Q.front().second;
		for(int k=0;k<8;++k){
			int ii,jj;
			ii=i+di[k],jj=j+dj[k];
			if(ii>0 && ii<=n && jj>0 && jj<=m && a[ii][jj]==0){
				a[ii][jj]=a[i][j]+1;
				Q.push(make_pair(ii,jj));
				//cout<<"bag("<<ii<<","<<jj<<") ";
			}
		}
		//cout<<"scot("<<i<<","<<j<<") ";
		Q.pop();
	}
	//cout<<endl;
}


int main(){
	fin>>n>>m;
	char s[105];
	fin.getline(s,105);
	for(int i=1;i<=n;++i){
		fin.getline(s,105);
		for(int j=0;j<m;++j){
			if(s[j]=='X')
				R[i][j+1]=J[i][j+1]=-1;
			if(s[j]=='R')
				iR=i,jR=j+1;
			if(s[j]=='J')
				iJ=i,jJ=j+1;
		}
	}
	//Afis(R);
	//Afis(J);
	fill(R,iR,jR);
	fill(J,iJ,jJ);
	//Afis(R);
	//Afis(J);
	int min=1<<16,imin,jmin;
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j)
			if(R[i][j]==J[i][j] && R[i][j]>0)
				if(R[i][j]<min)
					min=R[i][j],imin=i,jmin=j;
	fout<<min<<" "<<imin<<" "<<jmin<<"\n";
	return 0;
}