Cod sursa(job #79772)

Utilizator MariusMarius Stroe Marius Data 23 august 2007 20:05:45
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <fstream>
#include <memory>
using namespace std;

#define MaxN 110
int n, m, xr, yr, xj, yj;
char vLabirint[MaxN][MaxN];
int dx[8] = { -1, -1, -1, 0, 0, 1, 1, 1 };
int dy[8] = { -1,  0,  1,-1, 1,-1, 0, 1 };

void ReadData()
{
	ifstream fin("rj.in");
	fin >> n >> m;
	for (int i=0, j; i<=n; i++)
	{
		fin.getline(vLabirint[i]+1, MaxN);
		for (j=1; j<=m; j++)
			if (vLabirint[i][j] == 'R') { xr = i, yr = j; }
			else if (vLabirint[i][j] == 'J') { xj = i, yj = j; }
	}
	fin.close();
}

void WriteSolution(int x, int y,int tmin)
{
	ofstream fout("rj.out");
	fout << tmin <<' '<< x <<' '<< y;
	fout.close();
}

void MutaPersonaj(int c[MaxN][MaxN], int t)
{
	for (int i=1,j,k; i<=n; i++)
		for (j=1; j<=m; j++)
			if (c[i][j] == -1 && vLabirint[i][j] != 'X')
				for (k=0; k<8; k++)
					if (c[i+dx[k]][j+dy[k]] == t-1)
					{c[i][j] = t; break;}
}


void SolveAndWriteSolution()
{
	int cr[MaxN][MaxN], cj[MaxN][MaxN];
	memset(cr, -1, sizeof(int) * MaxN * MaxN);
	memset(cj, -1, sizeof(int) * MaxN * MaxN);
	cj[xj][yj] = 0;
	cr[xr][yr] = 0;
	bool intalnit;
	int i, j, t = 1;
	do
	{
		intalnit = false;
		MutaPersonaj(cj,t);
		MutaPersonaj(cr,t);
		++t;
		for (i=1; i<=n; i++)
			for (j=1; j<=m; j++)
				if (cr[i][j] == cj[i][j] && cr[i][j] != -1)
				{	WriteSolution(i,j,t);
					intalnit = true;
					break; }
	}
	while (intalnit == false);
}

void main(void)
{
	ReadData();
	SolveAndWriteSolution();
}