Cod sursa(job #1247647)

Utilizator AndreiIstetulAndrei Andrei AndreiIstetul Data 23 octombrie 2014 09:13:41
Problema Rj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <fstream>
#include <iostream>

using namespace std;

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

const int dl[] = {0, 1, 0, -1, -1, 1, -1, 1};
const int dc[] = {1, 0, -1, 0, -1, 1,  1,-1};
const int NMax = 102;
int n, m, xr, yr, xj, yj, i, k, tmin = NMax*NMax+5, xmin=-1, ymin=-1;
char l[NMax][NMax], c;
int r[NMax][NMax];
struct Pozitie {int l, c;};
Pozitie C[NMax*NMax], p;

void citire()
{
    int i, k;
    f >> n >> m;
    for (i=0; i<=n+1; i++) l[i][0] = l[i][m+1]='X';
    for (i=0; i<=m+1; i++) l[0][i] = l[n+1][i]='X';
    f.get(c);
    for (i=1; i<=n; i++)
	{
	    for (k=1; k<=m; k++)
		{
		    f.get(c);
		    l[i][k] = c;
            if (l[i][k]=='R')
            {
                xr = i;
                yr = k;
                l[i][k] = ' ';
            }
            if (l[i][k]=='J')
            {
                xj = i;
                yj = k;
                l[i][k] = ' ';
            }
		}
        f.get(c);
	}
}

void prob(int x0, int y0, int d[NMax][NMax])
{
    struct Pozitie {int l, c;} C[NMax*NMax], p;
    int prim=0, ult=0, i, k;
    for (i=0; i<=n+1; i++)
        for (k=0; k<=m+1; k++) d[i][k] = -1;
    C[0].l = x0;
    C[0].c = y0;
    d[x0][y0] = 1;
    while (prim<=ult)
	{
	 p=C[prim++];
	 for (i=0; i<8; ++i)
		if (l[p.l+dl[i]][p.c+dc[i]]==' ' and d[p.l+dl[i]][p.c+dc[i]]==-1)
        {
			d[p.l+dl[i]][p.c+dc[i]] = 1+d[p.l][p.c];
			C[++ult].l = p.l+dl[i];
			C[ult].c = p.c+dc[i];
        }
	}
}

void scriere(int j[NMax][NMax])
{
    for (i=1; i<=n; i++)
        for (k=1; k<=m; k++)
            if (r[i][k]==j[i][k])
                if (r[i][k]<tmin && r[i][k]!=-1)
				{
				    tmin = r[i][k];
				    xmin = i;
				    ymin = k;
                }
    g << tmin << ' ' << xmin << ' ' << ymin;
}

int main()
{
    int j[NMax][NMax];
    citire();
    prob(xr, yr, r);
    prob(xj, yj, j);
    scriere(j);
}