Cod sursa(job #702521)

Utilizator DumitracheIulianDumitrache Iulian DumitracheIulian Data 1 martie 2012 22:30:01
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.35 kb
#include <iostream>
#include <fstream>
using namespace std;

ifstream in ("rj.in");
ofstream out("rj.out");
const int N=105;
const short int dlin[]={-1,-1,0,1,1,1,0,-1};
const short int dcol[]={0,1,1,1,0,-1,-1,-1};
struct personaje{short int lin,col;} romeo,julie;
struct punct{short int lin,col; int pas;}coadar[N*N],coadaj[N*N];
int frontr,backr,r[N][N];
int frontj,backj,j[N][N];
char comun[N][N];
int n,m;

void plecari (int x, int y)
{
    if(comun[x][y]==' ')
        return;
    if(comun[x][y]=='R')
        {romeo.lin=x;romeo.col=y;}
    if(comun[x][y]=='J')
        {julie.lin=x;julie.col=y;}
}
void citire ()
{
    in>>n>>m;
    for(int i=1;i<=n;i++)
    {
        comun[i][1]=in.get();
        for(int j=1;j<=m;j++)
        {
            comun[i][j]=in.get();
            plecari(i,j);
        }
    }
}
bool bunr (int x)
{
    if((1<=coadar[x].lin)&&(coadar[x].lin<=n))
        if((1<=coadar[x].col)&&(coadar[x].col<=m))
            if(comun[coadar[x].lin][coadar[x].col]==' ')
                    return true;
    return false;
}
bool bunj (int x)
{
    if((1<=coadaj[x].lin)&&(coadaj[x].lin<=n))
        if((1<=coadaj[x].col)&&(coadaj[x].col<=m))
            if(comun[coadaj[x].lin][coadaj[x].col]==' ')
                    return true;
    return false;
}
void puncoadar (int x, int y, int p)
{
    coadar[frontr].lin=x;
    coadar[frontr].col=y;
    coadar[frontr].pas=p+1;
    frontr++;
}
void puncoadaj (int x, int y, int p)
{
    coadaj[frontj].lin=x;
    coadaj[frontj].col=y;
    coadaj[frontj].pas=p+1;
    frontj++;
}
void vecinir(int x, int y)
{
    for(int i=0;i<8;i++)
        puncoadar(x+dlin[i],y+dcol[i],r[x][y]);
}
void vecinij(int x, int y)
{
    for(int i=0;i<8;i++)
        puncoadaj(x+dlin[i],y+dcol[i],j[x][y]);
}
//void afis (int x, int y)
//{
    //out<<x<<" "<<y<<" "<<r[x][y]<<"\n";
//}
void pasromeo()
{
    if(bunr(backr))
    {
        if(r[coadar[backr].lin][coadar[backr].col]==0)
        {
            r[coadar[backr].lin][coadar[backr].col]=coadar[backr].pas;
            vecinir(coadar[backr].lin,coadar[backr].col);
        }
    }
    backr++;
}
void pasjulie()
{
    if(bunj(backj))
    {
        if(j[coadaj[backj].lin][coadaj[backj].col]==0)
        {
            j[coadaj[backj].lin][coadaj[backj].col]=coadaj[backj].pas;
            vecinij(coadaj[backj].lin,coadaj[backj].col);
        }
    }
    backj++;
}
void initromeo ()
{
    r[romeo.lin][romeo.col]=1;
    vecinir(romeo.lin,romeo.col);
}
void initjulie ()
{
    j[julie.lin][julie.col]=1;
    vecinij(julie.lin,julie.col);
}
/*void leeparalel ()
{
    initromeo();
    initjulie();
    while(1)
    {
        if(pasromeo())  return;
        if(pasjulie())  return;
    }
}*/
void afisc ()
{
    cout<<"\n\n";
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
            cout<<comun[i][j];
        cout<<"\n";
    }
}
void afisr ()
{
    cout<<"\n\n";
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
            cout<<r[i][j];
        cout<<"\n";
    }
}
void afisj ()
{
    cout<<"\n\n";
    for(int i=1;i<=n;i++)
    {
        for(int k=1;k<=m;k++)
            cout<<j[i][k];
        cout<<"\n";
    }
}/* */
/*bool pasromeo()
{
    if(bunr(backr))
    {
        if(r[coadar[backr].lin][coadar[backr].col]!=0)
            {backr++;return false;}
        r[coadar[backr].lin][coadar[backr].col]=coadar[backr].pas;
        if(j[coadar[backr].lin][coadar[backr].col]==coadar[backr].pas)
            {afis(coadar[backr].lin,coadar[backr].col);return true;}
        vecinir(coadar[backr].lin,coadar[backr].col);
        backr++;    return false;
    }
    else
    {backr++;return false;}
}
*/
void cauta ()
{
    int linmini,colmini,mini=N*N;
    for(int a=1;a<=n;a++)
        for(int b=1;b<=m;b++)
            if(r[a][b]==j[a][b])
                if((r[a][b]<mini)&&(r[a][b]!=0))
                {
                    mini=r[a][b];
                    linmini=a;
                    colmini=b;
                }
    out<<mini<<" "<<linmini<<" "<<colmini<<"\n";
}
int main ()
{
    citire();
    //afis();
    //leeparalel();
    initromeo();
    initjulie();
    while(backr<=frontr)
        pasromeo();
    while(backj<=frontj)
        pasjulie();
    afisc();
    afisr();
    afisj();
    cauta();
    return 0;
}