Cod sursa(job #534028)

Utilizator tudorsTudor Siminic tudors Data 14 februarie 2011 23:21:21
Problema Rj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <fstream>
#define INF 10001
using namespace std;
int n,m,pozx,pozy,mi;
int J[105][105],R[105][105];
int dl[9]={-1,-1,0,1,1,1,0,-1};
int dc[9]={0,1,1,1,0,-1,-1,-1};

ifstream f("rj.in");
ofstream g("rj.out");

void citire()
{
	char c;
	f>>n>>m;
	f.get(c);
	for (int i=1;i<=n;++i)
	{
		for (int j=1;j<=m;++j)
		{
			f.get(c);
			if (c==' ')
			{
				J[i][j]=INF;
				R[i][j]=INF;
			}
			else if (c=='X')
			{
				J[i][j]=-1;
				R[i][j]=-1;
			}
			else if (c=='R')
			{
				R[i][j]=0;
				J[i][j]=INF;
			}
			else if (c=='J')
			{
				R[i][j]=INF;
				J[i][j]=0;
			}
		}
		f.get(c);
	}
}

void lee(int x[105][105])
{
	int ok=1,l,c,d;
	while (ok)
	{
		ok=0;
		for (int i=1;i<=n;++i)
			for (int j=1;j<=m;++j)
				if (x[i][j]!=-1 && x[i][j]!=INF)
					for (d=0;d<=8;++d)
					{
						l=i+dl[d];
						c=j+dc[d];
						if (x[l][c]>x[i][j]+1 && l<=n && c<=m)
						{
							x[l][c]=x[i][j]+1;
							ok=1;
						}
					}
	}
}

void rezolva()
{
	mi=INF;
	for (int i=1;i<=n;++i)
		for (int j=1;j<=m;++j)
			if (R[i][j]==J[i][j] && J[i][j]!=INF && J[i][j]!=-1 && J[i][j]+1<mi)
			{
				mi=J[i][j]+1;
				pozx=i;
				pozy=j;
			}
	g<<mi<<" "<<pozx<<" "<<pozy;
}

int main()
{
	citire();
	lee(J);
	lee(R);
	rezolva();
	f.close();
	g.close();
	return 0;
}