Cod sursa(job #1841303)

Utilizator VikcocVictor Cociobanu Vikcoc Data 5 ianuarie 2017 15:07:42
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.85 kb
#include <iostream>
#include <fstream>
#include <string.h>
#include <queue>
using namespace std;
int N,M;
char R[102][102],J[102][102];
struct coord{int a,b;}a,b;
struct returne{int a,b,c;};
void citire()
{
    char v[104];
    ifstream f ("rj.in");
    f>>N>>M;
    f.get();
    int i,j;
    for (i=1;i<=N;++i)
    {
        f.get(R[i],102);
        f.get();
        if (strlen(R[i])!=M)
            for (j=R[i][strlen(R[i])];j<M;++j)
                R[i][j]=32;
        strcpy(v+1,R[i]);
        v[0]=32;
        strcpy(R[i],v);
        strcpy(J[i],R[i]);
    }
}
void RsiJ()
{
    bool c,d;
    int i;
    for (i=0,c=1,d=1;c || d;++i)
    {
        if (c)
            if (strchr(R[i],'R')-R[i]>=0)
            {
                a.a=i;
                a.b=strchr(R[i],'R')-R[i];
                c=0;
            }
        if (d)
            if (strchr(R[i],'J')-R[i]>=0)
            {
                b.a=i;
                b.b=strchr(R[i],'J')-R[i];
                d=0;
            }
    }
}
bool verifR(coord e)
{
    if (e.a>0 && e.a<=N && e.b>0 && e.b<=M && R[e.a][e.b]==32)
        return 1;
    return 0;
}
bool verifJ(coord e)
{
    if (e.a>0 && e.a<=N && e.b>0 && e.b<=M && J[e.a][e.b]==32)
        return 1;
    return 0;
}
void leeR()
{
    int i;
    queue<coord>d;
    d.push(a);
    R[a.a][a.b]=1;
    R[b.a][b.b]=32;
    coord e;
    while (!d.empty())
    {
        for (i=1;i<=8;++i)
        {
            switch(i)
            {
                case 1:{e.a=d.front().a-1;e.b=d.front().b;break;}
                case 2:{e.a=d.front().a+1;e.b=d.front().b;break;}
                case 3:{e.b=d.front().b-1;e.a=d.front().a;break;}
                case 4:{e.b=d.front().b+1;e.a=d.front().a;break;}
                case 5:{e.a=d.front().a-1;e.b=d.front().b-1;break;}
                case 6:{e.a=d.front().a-1;e.b=d.front().b+1;break;}
                case 7:{e.a=d.front().a+1;e.b=d.front().b-1;break;}
                case 8:{e.a=d.front().a+1;e.b=d.front().b+1;break;}
            }
            if (verifR(e))
            {
                if (R[d.front().a][d.front().b]==31)
                    R[e.a][e.b]=33;
                else
                    R[e.a][e.b]=1+R[d.front().a][d.front().b];
                d.push(e);
            }
        }
        d.pop();
    }
}
void leeJ(returne &op)
{
    op.a=10400;
    int c[2][8],i;
    queue<coord>d;
    d.push(b);
    J[a.a][a.b]=32;
    J[b.a][b.b]=1;
    coord e;
    while (!d.empty())
    {
        if (J[d.front().a][d.front().b]==R[d.front().a][d.front().b] && J[d.front().a][d.front().b]<op.a)
        {
            op.a=J[d.front().a][d.front().b];
            op.b=d.front().a;
            op.c=d.front().b;
        }
        for (i=1;i<=8;++i)
        {
            switch(i)
            {
                case 1:{e.a=d.front().a-1;e.b=d.front().b;break;}
                case 2:{e.a=d.front().a+1;e.b=d.front().b;break;}
                case 3:{e.b=d.front().b-1;e.a=d.front().a;break;}
                case 4:{e.b=d.front().b+1;e.a=d.front().a;break;}
                case 5:{e.a=d.front().a-1;e.b=d.front().b-1;break;}
                case 6:{e.a=d.front().a-1;e.b=d.front().b+1;break;}
                case 7:{e.a=d.front().a+1;e.b=d.front().b-1;break;}
                case 8:{e.a=d.front().a+1;e.b=d.front().b+1;break;}
            }
            if (verifJ(e))
            {
                if (J[d.front().a][d.front().b]==31)
                    J[e.a][e.b]=33;
                else
                    J[e.a][e.b]=1+J[d.front().a][d.front().b];
                d.push(e);
            }
        }
        d.pop();
    }
}
int main()
{
    citire();
    RsiJ();
    leeR();
    returne opp;
    leeJ(opp);
    if (opp.a>32)
        --opp.a;
    ofstream g ("rj.out");
    g<<opp.a<<' '<<opp.b<<' '<<opp.c;
}