Cod sursa(job #1880147)

Utilizator TataruTataru Mihai Tataru Data 15 februarie 2017 16:07:51
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.61 kb
#include <iostream>
#include <fstream>
#define inFile "rj.in"
#define outFile "rj.out"
#include <climits>
#include <iomanip>

using namespace std;

int aR[110][110],m,n,cR[10000][2],begR,endR,cJ[10000][2],begJ,endJ,lin[9]={0,-1,-1,0,1,1,1,0,-1},col[9]={0,0,1,1,1,0,-1,-1,-1},aJ[110][110];

void coada_in(int cD[10000][2],int &end,int l,int c)
{
    if(end+1>9999) end=0;
    else end++;
    cD[end][0]=l; cD[end][1]=c;
}

void citire()
{
    char c;
    ifstream fin(inFile);
    fin>>m>>n;
    fin.get(c);
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n;j++)
        {
            fin.get(c);
            if(c=='X' || c=='x') { aR[i][j]=-1; aJ[i][j]=-1; continue; }
            if(c=='R' || c=='r') { aR[i][j]=1; aJ[i][j]=1; coada_in(cR,endR,i,j); continue; }
            if(c=='J' || c=='j') { aR[i][j]=1; aJ[i][j]=1; coada_in(cJ,endJ,i,j); continue; }
        }
        fin.get(c);
    }
    fin.close();
}

void coada_out(int cD[10000][2],int &beg,int &l,int &c)
{
    if(beg+1>9999) beg=0;
    else beg++;
    l=cD[beg][0]; c=cD[beg][1];
}

void bordare()
{
    for(int i=0;i<=m+1;i++) aR[i][0]=aR[i][n+1]=aJ[i][0]=aJ[i][n+1]=-1;
    for(int j=0;j<=n+1;j++) aR[0][j]=aR[m+1][j]=aJ[0][j]=aJ[m+1][j]=-1;
}

void lee(int &lRez,int &cRez)
{
    int l,c,pas=1;
    while(endR!=begR)
    {
        coada_out(cR,begR,l,c);
        pas=aR[l][c]+1;
        for(int i=1;i<=8;i++)
            if(aR[l+lin[i]][c+col[i]]==0 || pas<aR[l+lin[i]][c+col[i]])
            {
                coada_in(cR,endR,l+lin[i],c+col[i]);
                aR[l+lin[i]][c+col[i]]=pas;
            }
    }
    while(endJ!=begJ)
    {
        coada_out(cJ,begJ,l,c);
        pas=aJ[l][c]+1;
        for(int i=1;i<=8;i++)
            if(aJ[l+lin[i]][c+col[i]]==0 || pas<aJ[l+lin[i]][c+col[i]])
            {
                coada_in(cJ,endJ,l+lin[i],c+col[i]);
                aJ[l+lin[i]][c+col[i]]=pas;
            }
    }
    int min=INT_MAX;
    for(int i=1;i<=m;i++)
        for(int j=1;j<=n;j++)
            if(aR[i][j]==aJ[i][j] && aR[i][j]>1 && aR[i][j]<min) { lRez=i; cRez=j; min=aR[i][j]; }
}

void afisare(int lRez,int cRez)
{
    ofstream fout(outFile);
    fout<<lRez<<" "<<cRez<<" "<<aJ[lRez][cRez];
    fout.close();
}

int main()
{
    int lRez,cRez;
    citire();
    bordare();
    lee(lRez,cRez);
    afisare(lRez,cRez);
    /*for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n;j++) cout<<setw(3)<<aR[i][j];
        cout<<"\n";
    }cout<<"\n\n";
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n;j++) cout<<setw(3)<<aJ[i][j];
        cout<<"\n";
    }*/
}