Cod sursa(job #2333876)

Utilizator mirceatlxhaha haha mirceatlx Data 2 februarie 2019 01:14:28
Problema Rj Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.25 kb
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("rj.in");
ofstream fout("rj.out");
int matrix1[105][105];
int matrix2[105][105];
int matrix3[105][105];
int n,m,i,j;
int startxj,startyj,startxr,startyr;
struct axis
{
    int x,y;
};
axis lg;
queue <axis> coada;
int dx[8]={1,0,-1,0,1,-1,1,-1};
int dy[8]={0,1,0,-1,1,-1,-1,1};
void Citire()
{
    fin>>n>>m;
    fin.get();
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
    {
        char c;
       c=fin.get();
       if(c=='\n')
       {
           j--;
           continue;
       }
        if(c==' ')
            matrix1[i][j]=matrix2[i][j]=matrix3[i][j]=0;
        if(c=='X')
            matrix1[i][j]=matrix2[i][j]=matrix3[i][j]=-1;
        if(c=='R' || c=='J')
        {
            matrix1[i][j]=matrix2[i][j]=matrix3[i][j]=1;
            if(c=='R')
                startxr=i,startyr=j;
            if(c=='J')
                startyj=j,startxj=i;
        }

    }
}
bool conditie(int x,int y)
{
    if(matrix1[x][y]!=0 || matrix2[x][y]!=0)
        return 0;
    if(x<1 || x>n || y<1 || y>m)
        return 0;
    return 1;
}
bool conditie1(int x,int y)
{
    if(matrix1[x][y]==-1 || matrix3[x][y]!=0)
        return 0;
    if(x<1 || x>n || y<1 || y>m)
        return 0;
    return 1;
}
void Romeo(int startxr,int startyr)
{
    lg.x=startxr;
    lg.y=startyr;
    coada.push(lg);
    while(!coada.empty())
    {
        int cx=coada.front().x;
        int cy=coada.front().y;
        coada.pop();
        for(i=0;i<8;i++)
        {
            int nx=cx+dx[i];
            int ny=cy+dy[i];
            if(conditie(nx,ny))
            {
                matrix2[nx][ny]=matrix2[cx][cy]+1;
                lg.x=nx;
                lg.y=ny;
                coada.push(lg);
            }
        }
        matrix1[cx][cy]=-2;
    }
}
int Julieta(int startxj,int startyj)
{
    int lin,col=m+5,val;
    int ok=0;
    lg.x=startxj;
    lg.y=startyj;
    coada.push(lg);
    matrix3[startxj][startyj]=1;
    while(!coada.empty())
    {
        int cx=coada.front().x;
        int cy=coada.front().y;
        coada.pop();
        for(i=0;i<8;i++)
        {
            int nx=cx+dx[i];
            int ny=cy+dy[i];
            if(conditie1(nx,ny))
            {
                if(matrix2[nx][ny]==matrix3[cx][cy]+1)
                {
                     ok=1;
                    if(ny<col)
                        col=ny;
                    val=matrix2[nx][ny];
                    lin=nx;
                }
                else
                {
                    matrix3[nx][ny]=matrix3[cx][cy]+1;
                }
                lg.x=nx;
                lg.y=ny;
                coada.push(lg);
            }
        }
        if(ok==1)
        {
            fout<<val<<" "<<lin<<" "<<col<<"\n";
            return 0;
        }
        matrix1[cx][cy]=-1;
    }
    return 0;
}
void Afisare()
{
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
            fout<<matrix2[i][j]<<" ";
        fout<<"\n";
    }
}
int main()
{
    Citire();
//Afisare();
    Romeo(startxr,startyr);
    while(!coada.empty())
        coada.pop();
    Julieta(startxj,startyj);
    return 0;
}