Cod sursa(job #876874)

Utilizator CosminRusuCosmin Rusu CosminRusu Data 12 februarie 2013 11:31:22
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.16 kb
#include <fstream>
#include <limits.h>
//#define DEBUG
using namespace std;
ifstream cin("rj.in");
ofstream cout("rj.out");
int n, m, q[3][10010], i, j, l[105][105],b[105][105], k, u, p, mini=INT_MAX, endi, endj, t_min;
char c , a[105];
inline int calc_min(int aa, int bb, int cc, int dd)
{
    if(aa==-2 || aa==0)
        aa=INT_MAX;
    if(bb==-2 || bb==0)
        bb=INT_MAX;
    if(cc==-2 || cc==0)
        cc=INT_MAX;
    if(dd==-2 || dd==0)
        dd=INT_MAX;
    int min1=min(aa, bb);
    int min2=min(cc, dd);
    return min(min1, min2);
}
void init()
{
    cin>>n>>m;
    cin.getline(a, 100);
    for(i=1;i<=n;i++){
        cin.getline(a, 100);
        for(j=0;j<m;j++)
            {
                c=a[j];
                if(c=='R')
                    {
                        k=1;
                        l[i][j+1]=0; //pornesc de la romeo
                        q[1][k]=i;
                        q[2][k]=j+1;
                    }
                else if(c=='X')   //poarta inchisa
                    {
                        l[i][j+1]=-2;
                        b[i][j+1]=-2;  //-2
                    }
                else if(c=='J')
                    {
                        l[i][j+1]=0;
                        b[i][j+1]=-3;
                        endi=i;
                        endj=j+1;
                    }
                else if(c==' ')
                    {
                        l[i][j+1]=-1;
                        b[i][j]=0;
                    }

            }
    }
}
void intr(int c, int d)
{
    u=u+1;
    q[1][u]=c;
    q[2][u]=d;
}
void extr(int &c, int &d)
{
    p=p+1;
    c=q[1][p];
    d=q[2][p];
}
void lee()
{
    int x, y;
    u=1;
    p=0;
    while(p!=u)
    {
            extr(x, y);
            if(x>1)
                if(b[x-1][y]==0)
                    if(l[x-1][y]>l[x][y]+1 || l[x-1][y]==-1)
                        {
                            l[x-1][y]=l[x][y]+1;
                            intr(x-1, y);
                        }
            if(x<n)
                if(b[x+1][y]==0)
                    if(l[x+1][y]>l[x][y]+1 || l[x+1][y]==-1)
                        {
                            l[x+1][y]=l[x][y]+1;
                            intr(x+1, y);
                        }
            if(y<m)
                if(b[x][y+1]==0)
                    if(l[x][y+1]>l[x][y]+1 || l[x][y+1]==-1)
                        {
                            l[x][y+1]=l[x][y]+1;
                            intr(x, y+1);
                        }
            if(y>1)
                if(b[x][y-1]==0)
                    if(l[x][y-1]>l[x][y]+1 || l[x][y-1]==-1)
                        {
                            l[x][y-1]=l[x][y]+1;
                            intr(x, y-1);
                        }

    }



}
int main()
{
    init();
    lee();
#ifdef DEBUG
    for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
                cout<<l[i][j]<<" ";

            cout<<"\n";
        }
#endif
    t_min=((calc_min(l[endi-1][endj], l[endi+1][endj], l[endi][endj-1], l[endi][endj+1]))+1)/2;
    cout<<t_min;

    return 0;
}