Cod sursa(job #1374697)

Utilizator NNelutuRosca Ioan NNelutu Data 5 martie 2015 10:29:52
Problema Rj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <fstream>
#include<queue>
#define N 105
#define punct pair<int,int>
#define x first
#define y second
using namespace std;
ifstream fin("rj.in");
ofstream fout("rj.out");
int n,m,i,j,ro[N][N],ju[N][N],a,b,mini;
char x[N];
const int DX[]={0,0,1,1,1,-1,-1,-1};
const int DY[]={1,-1,0,-1,1,-1,0,1};
punct startr,startj,now,nxt;
queue<punct> Q;
bool verif(punct z)
{
    if(z.x>0 && z.x<=n &&z.y>0 && z.y<=m)
        return 1;
    return 0;
}
void lee(punct start,int a[N][N])
{
    Q.push(start);
    a[start.x][start.y]=1;
    while(!Q.empty())
    {

        now=Q.front();
        for(i=0;i<8;i++)
        {
            nxt.x=now.x+DX[i];
            nxt.y=now.y+DY[i];
            if(a[nxt.x][nxt.y]==0 && verif(nxt)==1)
            {
                a[nxt.x][nxt.y]= a[now.x][now.y]+1;
                Q.push(nxt);
            }
        }
        Q.pop();
    }
}

int main()
{
fin>>n>>m;
for(i=1;i<=n;i++)
{
    fin.get();
    fin.get(x,105);
    for(j=1;j<=m;j++)
    {
        if(x[j-1]=='X')
            ro[i][j]=ju[i][j]=-1;
        if(x[j-1]=='R')
        {
            ro[i][j]=1;
            startr=make_pair(i,j);
        }
        if(x[j-1]=='J')
        {
            ju[i][j]=1;
            startj=make_pair(i,j);
        }
    }
}

lee(startr,ro);
lee(startj,ju);
mini=1000000;
for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
        if(ro[i][j]==ju[i][j] && ro[i][j]>0 && mini>ro[i][j])
        {
            mini=ro[i][j];
            a=i;
            b=j;
        }
fout<<mini<<" "<<a<<" "<<b;

return 0;
}