Cod sursa(job #1712682)

Utilizator cristiancCristian cristianc Data 3 iunie 2016 12:47:11
Problema Rj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.61 kb
#include <fstream>
using namespace std;
int main()
{
	ifstream ii("rj.in");
	ofstream oo("rj.out");

	struct pct
	{
		short i, j;
		pct(short a, short b) {i = a; j = b;}
		pct(){}
	} decal[8] = {pct(-1, -1), pct(-1, 0), pct(-1, 1), pct(0, -1),
					pct(0, 1), pct(1, -1), pct(1, 0), pct(1, 1)};

	short n = 0, m = 0, i, j, k;
	ii >> n >> m;  ii.get();
	char a[n][m+1]; short marcrom[n+1][m+1], marcjul[n+1][m+1];
	pct rom[n*m+1], jul[n*m+1], sol[n*m+1];  short dimr = 1, dimj = 1;
	short soli = n, solj = m, solt = n*m;

	for (i = 0; i < n; i++)
		for (j = 0; j < m; j++)
			marcrom[i][j] = marcjul[i][j] = -1;
	for (i = 0; i < n; i++)
	{
		ii.getline(a[i], m+1);
		if (!ii.gcount())
			for (j = 0; j < m; j++)
				a[i][j] = ' ';
		else for (j = ii.gcount()-1; j < m; j++)
				a[i][j] = ' ';
		for (j = 0; j < m; j++)
			if (a[i][j] == 'R')
				rom[0].i = i, rom[0].j = j, marcrom[i][j] = 0;
			else if (a[i][j] == 'J')
				jul[0].i = i, jul[0].j = j, marcjul[i][j] = 0;
	}
	for (i = 0; i < dimr; i++)	// ROMEO
	{
		for (j = 0; j < 8; j++)
		{
			rom[dimr].i = rom[i].i + decal[j].i;
			rom[dimr].j = rom[i].j + decal[j].j;
			if (rom[dimr].i < 0 || rom[dimr].i > n-1)	//
				continue;								// Daca iese din bounds
			if (rom[dimr].j < 0 || rom[dimr].j > m-1)	//
				continue;
			if (marcrom[rom[dimr].i][rom[dimr].j] > -1)	// S-a parcurs deja
				continue;
			if (a[rom[dimr].i][rom[dimr].j] == 'X')		// Inaccesibil
				continue;
			marcrom[rom[dimr].i][rom[dimr].j] = marcrom[rom[i].i][rom[i].j] + 1;
			dimr++;
		}
	}
	for (i = 0; i < dimj; i++)	// JULIETA
	{
		for (j = 0; j < 8; j++)
		{
			jul[dimj].i = jul[i].i + decal[j].i;
			jul[dimj].j = jul[i].j + decal[j].j;
			if (jul[dimj].i < 0 || jul[dimj].i > n-1)	//
				continue;								// Daca iese din bounds
			if (jul[dimj].j < 0 || jul[dimj].j > m-1)	//
				continue;
			if (marcjul[jul[dimj].i][jul[dimj].j] > -1)	// S-a parcurs deja
				continue;
			if (a[jul[dimj].i][jul[dimj].j] == 'X')		// Inaccesibil
				continue;

			marcjul[jul[dimj].i][jul[dimj].j] = marcjul[jul[i].i][jul[i].j] + 1;
			dimj++;
		}
	}

	for (i = 0; i < n; i++)
		for (j = 0; j < m; j++)
			if (marcrom[i][j] == marcjul[i][j] && marcrom[i][j] <= solt && marcrom[i][j] >= 0)
				{
					if (marcrom[i][j] < solt)
					{
						solt = marcrom[i][j];
						soli = i;  solj = j;
					}
					else if (i < soli)
					{
						solt = marcrom[i][j];
						soli = i;  solj = j;
					}
					else if (i == soli && j < solj)
					{
						solt = marcrom[i][j];
						soli = i;  solj = j;
					}
				}

	oo << solt+1 << ' ' << soli+1 << ' ' << solj+1;
}