Cod sursa(job #1667382)

Utilizator NaomiionNaomi Moisuc Naomiion Data 28 martie 2016 21:31:45
Problema Rj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.21 kb
#include <fstream>
#include <cstring>
using namespace std;
unsigned short int n,m,xr,yr,xj,yj,minn,lm,cm;
short int rom[101][101],juli[101][101];

//unsigned short int px[251],py[251],np;
//unsigned short qx[250*250],qy[250*250],sf;
const int dx[]={7,-1,0,1,0,-1,1,-1,1};
const int dy[]={7,0,-1,0,1,-1,-1,1,1};
void citire()
{
    ifstream f("rj.in");
    f>>n>>m;
    char x[101];
    int i,j;
    f.getline(x,251,'\n');
    for(i=1;i<=n;i++)
    {
        strcpy(x,x+strlen(x));
        f.getline(x,251,'\n');
        for(j=0;j<strlen(x);j++)
        {if(x[j]==' ')
        rom[i][j+1]=juli[i][j+1]=0;
        else
        if(x[j]=='X')
        rom[i][j+1]=juli[i][j+1]=-1;
        else
        if(x[j]=='R')
        {
            rom[i][j+1]=juli[i][j+1]=0;
            xr=i;
            yr=j+1;
        }
        else
        if(x[j]=='J')
        {
            rom[i][j+1]=juli[i][j+1]=0;
            xj=i;
            yj=j+1;
        }
        }

    }
}
void lee_nerec_rom()
{
    unsigned short int xx,yy,k,x,y,qx[250*250],qy[250*250],sf,inc;
    inc=1;
    sf=1;
    qx[1]=xr;
    qy[1]=yr;
    while(inc<=sf)
    {
        x=qx[inc];
        y=qy[inc];
        inc++;
        for(k=1;k<=8;k++)
        {
            xx=x+dx[k];
            yy=y+dy[k];
            if(xx>0&&xx<=n&&yy>0&&yy<=m&&(xx!=xr||yy!=yr))
            if(rom[xx][yy]==0||rom[xx][yy]>rom[x][y]+1)
            {
                sf++;
                qx[sf]=xx;
                qy[sf]=yy;
                rom[xx][yy]=rom[x][y]+1;
            }
        }
    }
}
void lee_nerec_julita()
{
    unsigned short int xx,yy,k,inc,x,y,qx[101*101],qy[101*101],sf;
    inc=sf=1;
    qx[1]=xj;
    qy[1]=yj;
    while(inc<=sf)
    {
        x=qx[inc];
        y=qy[inc];
        inc++;
        for(k=1;k<=8;k++)
        {
            xx=x+dx[k];
            yy=y+dy[k];
            if(xx>0&&xx<=n&&yy>0&&yy<=m&&(xx!=xj||yy!=yj))
            if(juli[xx][yy]==0||juli[xx][yy]>juli[x][y]+1)
            {
                sf++;
                qx[sf]=xx;
                qy[sf]=yy;
                juli[xx][yy]=juli[x][y]+1;
            }
        }
    }
}
void cmp()
{
    int i,j;
    minn=101*101;
    for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
    if(rom[i][j]==juli[i][j]&&rom[i][j]>0)
    {
        if(rom[i][j]<minn)
        {
            minn=rom[i][j];
            lm=i;
            cm=j;
        }
        else
        if(rom[i][j]==minn)
        {
            if(i<lm)
            {
                lm=i;
                cm=j;
            }
            else
            if(i==lm)
            {
                if(j<cm)
                cm=j;
            }
        }
    }
    minn++;
}
void afisare()
{

    /*int i,j;

    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        g<<rom[i][j]<<" ";
        g<<'\n';
    }
    g<<'\n';
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        g<<juli[i][j]<<" ";
        g<<'\n';
    }
    g<<'\n';*/
    ofstream g("rj.out");
    g<<minn<<" "<<lm<<" "<<cm<<" "<<'\n';
}
int main()
{
    citire();
    afisare();
    lee_nerec_rom();
    lee_nerec_julita();
    cmp();
    afisare();
    return 0;
}