Cod sursa(job #1002932)

Utilizator cristigrigoreGrigore Cristan Andrei cristigrigore Data 29 septembrie 2013 12:00:35
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <fstream>
#include <cstring>
#define inf 10000
using namespace std;
ifstream f("rj.in");
ofstream g("rj.out");
const int dx[]={-1,-1,0,1,1,1,0,-1};
const int dy[]={0,1,1,1,0,-1,-1,-1};
int k,N,M,i,j,xr,yr,xj,yj,a[200][200],z1,z2;
char c[1001];
bool verif(int x,int y)
{
    if(x>N || y>M || x<0 || y<0 || a[x][y]==-1) return true;
    return false;
}
void lee()
{
    int i,xx,yy,x,y;
    bool ok;
    ok=true;
    while(ok)
    {
        ok=false;
        for(x=1; x<=N; x++)
        for(y=1; y<=M; y++)
        {
            if(verif(x,y)==true || a[x][y]==inf) continue;
            for(i=0; i<=7; i++)
            {
                xx=x+dx[i];
                yy=y+dy[i];
                if(verif(xx,yy)==true) continue;
                if(a[xx][yy]>a[x][y]+1) {a[xx][yy]=a[x][y]+1;ok=true;}
            }
        }
    }
}
void drum(int x, int y)
{
    int i,xx,yy;
    if(a[xj][yj]%2==0)
    if(a[x][y]==a[xj][yj]/2) {z1=x; z2=y; }
    if(a[xj][yj]%2!=0)
    if(a[x][y]==a[xj][yj]/2+1) {z1=x; z2=y; }
    if(a[x][y]!=a[xj][yj]/2)
    for(i=0; i<=7; i++)
    {
        xx=x-dx[i];
        yy=y-dy[i];
        if(a[xx][yy]+1==a[x][y])
        {
            drum(xx,yy);
            break;
        }
    }
}
int main()
{
   f>>N>>M;
   f.get();
   for(i=1; i<=N; i++)
   {
       f.getline(c,1000);
       k=strlen(c);
       for(j=0; j<k+1; j++)
       {
           if(c[j]=='X') a[i][j+1]=-1;
           else a[i][j+1]=inf;
           if(c[j]=='R') {xr=i;yr=j+1;a[i][j+1]=1;}
           if(c[j]=='J') {xj=i;yj=j+1;}
       }

   }
   lee();
   drum(xj,yj);

   g<<a[z1][z2]<<' '<<z1<<' '<<z2;


    return 0;
}