Cod sursa(job #702557)

Utilizator DumitracheIulianDumitrache Iulian DumitracheIulian Data 1 martie 2012 22:51:52
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.52 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;}coada[N*N];
int front,back,r[N][N],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<=coada[x].lin)&&(coada[x].lin<=n))
        if((1<=coada[x].col)&&(coada[x].col<=m))
            if(comun[coada[x].lin][coada[x].col]==' ')
                    return true;
    return false;
}
bool bunj (int x)
{
    if((1<=coada[x].lin)&&(coada[x].lin<=n))
        if((1<=coada[x].col)&&(coada[x].col<=m))
            if(comun[coada[x].lin][coada[x].col]==' ')
                    return true;
    return false;
}
void puncoadar (int x, int y, int p)
{
    coada[front].lin=x;
    coada[front].col=y;
    coada[front].pas=p+1;
    front++;
}
void puncoadaj (int x, int y, int p)
{
    coada[front].lin=x;
    coada[front].col=y;
    coada[front].pas=p+1;
    front++;
}
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 pasromeo()
{
    if(bunr(back))
    {
        if(r[coada[back].lin][coada[back].col]==0)
        {
            r[coada[back].lin][coada[back].col]=coada[back].pas;
            vecinir(coada[back].lin,coada[back].col);
        }
    }
    back++;
}
void pasjulie()
{
    if(bunj(back))
    {
        if(j[coada[back].lin][coada[back].col]==0)
        {
            j[coada[back].lin][coada[back].col]=coada[back].pas;
            vecinij(coada[back].lin,coada[back].col);
        }
    }
    back++;
}
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 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";
    }
}
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();
    initromeo();
    while(back<=front)
        pasromeo();
    front=back=0;
    initjulie();
    while(back<=front)
        pasjulie();
    afisc();
    afisr();
    afisj();
    cauta();
    return 0;
}