Cod sursa(job #1777688)

Utilizator cristianursacheCristian Ursache cristianursache Data 12 octombrie 2016 20:03:18
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <fstream>

using namespace std;

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

const int N = 105,M = 105;

const int dl[] = {-1,0,0,1,-1,-1,1,1};
const int dc[] = {0,-1,1,0,-1,1,-1,1};

struct poz
{
    int l,c;
};

poz q1[N*M],q2[N*M],x,y;
char a[N][M];
int r[N][M],j[N][M],p1,p2,u1,u2;

int main()
{
    int n,m,i,k,imin,kmin,min = 150;
    in>>n>>m>>ws;
    for(i=0; i<=n+1; i++)
    {
        r[i][0]=r[i][m+1] = -2;
        j[i][0]=j[i][m+1] = -2;
    }
    for(k=0; k<=m+1; k++)
    {
        r[0][k]=r[n+1][k] = -2;
        j[0][k]=j[n+1][k] = -2;
    }
    p1 = p2 = 0;
    u1 = u2 = -1;
    for(i=1; i<=n; i++)
    {
        in.getline(1+a[i],N);
        //out << "am citit:\n" << 1 + a[i] << "\n";
        for(k=1; k<=m; k++)
        {
            if(a[i][k]=='X')
                r[i][k] = j[i][k] = -2;
            if(a[i][k]==' ')
                r[i][k] = j[i][k] = -1;
            if(a[i][k]=='R')
            {
                r[i][k] = 0;
                q1[++u1]=(poz)
                {
                    i,k
                };
            }
            if(a[i][k]=='J')
            {
                j[i][k]= 0;
                q2[++u2]=(poz)
                {
                    i,k
                };
            }
        }
    }
    while(p1<=u1)
    {
        x = q1[p1++];
        for(i=0; i<8; i++)
        {
            y.l = x.l + dl[i];
            y.c = x.c + dc[i];

            if(r[y.l][y.c]==-1)
            {
                r[y.l][y.c]=1+r[x.l][x.c];
                q1[++u1]=y;
            }
        }
    }
    while(p2<=u2)
    {
        x = q2[p2++];
        for(i=0; i<8; i++)
        {
            y.l = x.l + dl[i];
            y.c = x.c + dc[i];
            if(j[y.l][y.c]==-1)
            {
                j[y.l][y.c]=1+j[x.l][x.c];
                q2[++u2]=y;
            }
        }
    }
    for(i=1; i<=n; i++)
        for(k=1; k<=m; k++)
        {
            if(r[i][k]==j[i][k] && r[i][k]<min && r[i][k] > 0)
            {
                min = r[i][k] + 1;
                imin = i;
                kmin = k;
            }
        }
    out<<min<<" "<<imin<<" "<<kmin;
    return 0;
}