Cod sursa(job #1880148)

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

using namespace std;

int a[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};

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') { a[i][j]=100000; continue; }
            if(c=='R' || c=='r') { a[i][j]=1; coada_in(cR,endR,i,j); continue; }
            if(c=='J' || c=='j') { a[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++) a[i][0]=a[i][n+1]=-1;
    for(int j=0;j<=n+1;j++) a[0][j]=a[m+1][j]=-1;
}

void lee(int &lRez,int &cRez)
{
    int l,c,pas;
    while(endR!=begR)
    {
        coada_out(cR,begR,l,c);
        pas=a[l][c]+1;
        for(int i=1;i<=8;i++)
            if(a[l+lin[i]][c+col[i]]==0 || (pas<a[l+lin[i]][c+col[i]] && a[l+lin[i]][c+col[i]]!=100000))
            {
                coada_in(cR,endR,l+lin[i],c+col[i]);
                a[l+lin[i]][c+col[i]]=pas;
            }
    }
    while(endJ!=begJ)
    {
        coada_out(cJ,begJ,l,c);
        pas=a[l][c]-1;
        for(int i=1;i<=8;i++)
            if((a[l+lin[i]][c+col[i]]>0 && a[l+lin[i]][c+col[i]]!=-pas) || (pas>a[l+lin[i]][c+col[i]] && a[l+lin[i]][c+col[i]]<0 ))
            {
                coada_in(cJ,endJ,l+lin[i],c+col[i]);
                a[l+lin[i]][c+col[i]]=pas;
            }
            else if(a[l+lin[i]][c+col[i]]==-pas) { lRez=l+lin[i]; cRez=c+col[i]; return; }
            cout<<"a";
    }
}

void afisare(int lRez,int cRez)
{
    ofstream fout(outFile);
    fout<<lRez<<" "<<cRez<<" "<<a[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)<<a[i][j];
        cout<<"\n";
    }cout<<"\n\n";
}