Cod sursa(job #1327763)

Utilizator eduardcazacuEduard Cazacu eduardcazacu Data 27 ianuarie 2015 08:32:23
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.59 kb
#include <fstream>
#include <iomanip>
#include <cstring>

using namespace std;

ifstream f("rj.in");
ofstream g("rj.out");

int n,m,a[101][101]={},b[101][101];
struct coord
{
int x,y;
} rom,jul,c[101],p,v;

void citire()
{
    char c,linie[101];
    f>>n>>m;
    f.get();
    for(int i=1; i<=n; i++)
    {
        f.getline(linie,101);
        for(int j=0; j<m; j++)
        {
            c=linie[j];
            if(c=='R')
            {
                rom.x=i,rom.y=j+1;
            }
            else if(c=='J')
            {
                jul.x=i;
                jul.y=j+1;
            }
            else if(c=='X'){a[i][j+1]=-1;b[i][j+1]=-1;}
        }
    }

}
void bordare()
{
    for(int i=0; i<=n+1; i++){a[i][0]=-1;b[i][0]=-1;}
    for(int i=0; i<=n+1; i++){a[i][n+1]=-1;b[i][n+1]=-1;}
    for(int i=0; i<=n+1; i++){a[0][i]=-1;b[0][i]=-1;}
    for(int i=0; i<=n+1; i++){a[n+1][i]=-1;b[n+1][i]=-1;}
}
void afisare(){
    for(int i=0;i<=n+1;i++){
        for(int j=0;j<=m+1;j++){
            g<<setw(2)<<a[i][j]<<" ";
        }
        g<<'\n';
    }
    g<<'\n';
    for(int i=0;i<=n+1;i++){
        for(int j=0;j<=m+1;j++){
            g<<setw(2)<<b[i][j]<<" ";
        }
        g<<'\n';
    }
}

void leeRom(){
    int prim=0,ultim=0,nrDir=8;

    int dl[]={-1, -1, -1, 0, 1, 1, 1, 0};
    int dc[]={-1,  0,  1, 1, 1, 0,-1,-1};

    c[0]=rom;
    a[rom.x][rom.y]=1;

    while(prim<=ultim && a[jul.x][jul.y]==0){
        p=c[prim];
        prim++;
        for(int k=0;k<nrDir;k++){
            v.x=p.x+dl[k];
            v.y=p.y+dc[k];

            if(a[v.x][v.y]==0){
                a[v.x][v.y]=a[p.x][p.y]+1;
                ultim++;
                c[ultim]=v;
            }
        }
    }
}
void leeJul(){
    int prim=0,ultim=0,nrDir=8;

    int dl[]={-1, -1, -1, 0, 1, 1, 1, 0};
    int dc[]={-1,  0,  1, 1, 1, 0,-1,-1};

    c[0]=jul;
    b[jul.x][jul.y]=1;

    while(prim<=ultim && b[rom.x][rom.y]==0){
        p=c[prim];
        prim++;
        for(int k=0;k<nrDir;k++){
            v.x=p.x+dl[k];
            v.y=p.y+dc[k];

            if(b[v.x][v.y]==0){
                b[v.x][v.y]=b[p.x][p.y]+1;
                ultim++;
                c[ultim]=v;
            }
        }
    }
}

void intalnire (){

    int lmin=0,cmin=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
        if(a[i][j]==b[i][j]&&a[i][j]!=0&&a[i][j]!=-1)g<<a[i][j]<<" "<<i<<" "<<j<<'\n';
        }
    }
}

int main(){
    citire();
    bordare();
    leeRom();
    leeJul();
    intalnire();
return 0;
}