Cod sursa(job #1171993)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 16 aprilie 2014 17:06:27
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 kb
#include <cstdio>
#include <queue>
#include <algorithm>
#define IN "rj.in"
#define OUT "rj.out"
#define NRMAX 105
#define INF (1<<7)-1
using namespace std;
char a[NRMAX][NRMAX],b[NRMAX][NRMAX];
pair<char, char> pozi,pozf,aux,auxi;
queue< pair<char,char> > coada;
static const int dx[]= {-1,0,1,0,-1,1,1,-1},dy[]= {0,1,0,-1,1,1,-1,-1};
char n,m,pozx,pozy,mini=INF;
void bordare(void);
void drumbun(void);
inline bool inauntru(pair <char,char>a)
{
    return a.first>0&&a.first<=n&&a.second>0&&a.second<=m;
}
int main()
{
    FILE *in=fopen(IN,"r"),*out=fopen(OUT,"w");
    char i,j,c;
    fscanf(in,"%d%d",&n,&m);
    for(i=1; i<=n; ++i)
    {
        for(j=1; j<=m; ++j)
        {
            fscanf(in,"%c",&c);
            if(c=='R') pozi=make_pair(i,j),a[i][j]=1;
            else if(c=='J') pozf=make_pair(i,j),b[i][j]=1;
            else if(c=='X') a[i][j]=b[i][j]=2;
        }
    }
    fclose(in);
    coada.push(pozi);
    while(!coada.empty())
    {
        aux=coada.front();
        coada.pop();
        for(i=0; i<8; ++i)
        {
            auxi=make_pair(aux.first+dx[i],aux.second+dy[i]);
            if(!a[auxi.first][auxi.second]&&inauntru(auxi))
            {
                a[auxi.first][auxi.second]=a[aux.first][aux.second]+1;
                coada.push(auxi);
            }
        }
    }
    coada.push(pozf);
    while(!coada.empty())
    {
        aux=coada.front();
        coada.pop();
        for(i=0; i<8; ++i)
        {
            auxi=make_pair(aux.first+dx[i],aux.second+dy[i]);
            if(!b[auxi.first][auxi.second]&&inauntru(auxi))
            {
                b[auxi.first][auxi.second]=b[aux.first][aux.second]+1;
                coada.push(auxi);
            }
        }
    }
    drumbun();
    fprintf(out,"%d %d %d\n",mini,pozx,pozy);
    fclose(out);
    return 0;
}
void drumbun(void)
{
    int i,j;
    for(i=1; i<=n; ++i)
    {
        for(j=1; j<=m; ++j)
        {
            if(a[i][j]==b[i][j]&&a[i][j]<mini&&a[i][j]&&a[i][j]!=2)
            {
                mini=a[i][j];
                pozx=i;
                pozy=j;
            }
        }
    }
}