Cod sursa(job #1512501)

Utilizator filip.mihalutMihalut Filip filip.mihalut Data 28 octombrie 2015 09:58:43
Problema Rj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.32 kb
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream f ("rj.in");
ofstream g ("rj.out");
queue < pair < int,int > > coada ;
int di[]={-1,0,1,0,-1,1,1,-1},dj[]={0,1,0,-1,1,1,-1,-1},i,j,i1,J,starti,startj,stopi,stopj,n,m,a[101][101],directie,b[101][101],Min=9999999;
char x,sir[101];
bool bun (int i,int j)
{
    if(i<1||j<1||i>n||j>m)
        return false;
    if(a[i][j]==-1)
        return false;
    return true;
}
void afisare()
{
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
            cout<<a[i][j]<<" ";
        cout<<endl;
    }
}
void lee()
{
    a[starti][startj]=1;
    coada.push(make_pair(starti,startj));
    while (!coada.empty())
    {
        i=coada.front().first;
        j=coada.front().second;
        coada.pop();
        for(directie=0;directie<8;directie++)
        {
            i1=i+di[directie];
            J=j+dj[directie];
            if(bun(i1,J)&&a[i1][J]<1)
            {
                coada.push(make_pair(i1,J));
                a[i1][J]=a[i][j]+1;
            }
        }
    }
}

void citire()
{
    f>>n>>m;
    f.get();
    for(i=1;i<=n;i++)
     {
         f.get(sir,101);
      for(j=0;j<m;j++)
      {
        x=sir[j];
        if(x=='X')
            a[i][j+1]=-1;
        if(x=='R')
        {
            starti=i;
            startj=j+1;
        }
        if(x=='J')
        {
            stopi=i;
            stopj=j+1;
        }
      }
      f.get();
    }
}
void copiereb()
{
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            b[i][j]=a[i][j];
}
void copierea()
{
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            swap(a[i][j],b[i][j]);
    swap(starti,stopi);
    swap(startj,stopj);
}
void compara()
{
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        {
            if(a[i][j]>0&&b[i][j]>0)
            {
                if(a[i][j]==b[i][j])
                {
                    if(Min>a[i][j])
                    {
                        Min=a[i][j];
                        stopi=i;
                        stopj=j;
                    }
                }
            }
        }
}
int main()
{
    citire();
    copiereb();
    lee();
    copierea();
    lee();
    compara();
    g<<Min<<" "<<stopi<<" "<<stopj;
    return 0;
}