Cod sursa(job #413517)

Utilizator SpiderManSimoiu Robert SpiderMan Data 8 martie 2010 18:07:41
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.67 kb
//Autor Simoiu Robert 100 pct.
#include <fstream>
using namespace std;

#define MAX 100000
#define M 105
#define oo 0x3f3f3f3f
int n,m,i,j,k,l,q1=1,q2=1,ct[M][M],cy[M][M],xx,yy,minim;
bool stop;
char s[M];

ifstream f("rj.in");
ofstream g("rj.out");

struct vector1
{
    int st,dr;
} q[MAX],Q[MAX];
void citire()
{
    f>>n>>m;f.getline(s,2);
    for (i=1;i<=n;i++){
        f.getline(s,110);
        for (j=0;j<m;j++)
        {
            if (s[j]=='X') ct[i][j+1]=-2,cy[i][j+1]=-2;
            else if (s[j]=='J') ct[i][j+1]=-1;
            else if (s[j]=='R') cy[i][j+1]=-1;
            else ct[i][j+1]=0,cy[i][j+1]=0;
            if (ct[i][j+1]==-1)
            {
                q[0].st=i;
                q[0].dr=j+1;

            }
            else if (cy[i][j+1]==-1)
            {
                Q[0].st=i;
                Q[0].dr=j+1;
            }
        }}
}
inline void dreapta(int ct[][M],vector1 q[],int &q1)
{
    q[q1].st=i;
    q[q1++].dr=j+1;
    ct[i][j+1]=k+1;
}
inline void stanga(int ct[][M],vector1 q[],int &q1)
{
    q[q1].st=i;
    q[q1++].dr=j-1;
    ct[i][j-1]=k+1;
}
inline void sus(int ct[][M],vector1 q[],int &q1)
{
    q[q1].st=i-1;
    q[q1++].dr=j;
    ct[i-1][j]=k+1;
}
inline void jos(int ct[][M],vector1 q[],int &q1)
{
    q[q1].st=i+1;
    q[q1++].dr=j;
    ct[i+1][j]=k+1;
}
inline void susdreapta(int ct[][M],vector1 q[],int &q1)
{
    q[q1].st=i-1;
    q[q1++].dr=j+1;
    ct[i-1][j+1]=k+1;
}
inline void susstanga(int ct[][M],vector1 q[],int &q1)
{
    q[q1].st=i-1;
    q[q1++].dr=j-1;
    ct[i-1][j-1]=k+1;
}
inline void josdreapta(int ct[][M],vector1 q[],int &q1)
{
    q[q1].st=i+1;
    q[q1++].dr=j+1;
    ct[i+1][j+1]=k+1;
}
inline void josstanga(int ct[][M],vector1 q[],int &q1)
{
    q[q1].st=i+1;
    q[q1++].dr=j-1;
    ct[i+1][j-1]=k+1;
}
inline void verf(int ct[][M],vector1 q[],int &q1)
{
    if ((ct[i][j+1]==0) && !(j==m) )
        dreapta(ct,q,q1);

    if ((ct[i][j-1]==0) && !(j==1) )
        stanga(ct,q,q1);

    if ((ct[i-1][j]==0) && !(i==1) )
        sus(ct,q,q1);

    if ((ct[i+1][j]==0) && !(i==n) )
        jos(ct,q,q1);

    if ((ct[i-1][j-1]==0) && !(i==1 || j==1) )
        susstanga(ct,q,q1);

    if ((ct[i-1][j+1]==0) && !(i==1 || j==m) )
        susdreapta(ct,q,q1);

    if ((ct[i+1][j-1]==0) && !(i==n || j==1) )
        josstanga(ct,q,q1);

    if ((ct[i+1][j+1]==0) && !(i==n || j==m) )
        josdreapta(ct,q,q1);

}
inline void solve(int ct[][M],vector1 q[],int q1)
{
    stop=0;k=1;
    for (l=0;!stop;l++)
    {
        i=q[l].st;
        j=q[l].dr;
        if (i==0) stop=1;
        else {
        verf(ct,q,q1);
        if (!((ct[q[l].st][q[l].dr]==ct[q[l+1].st][q[l+1].dr]) || (ct[q[l].st][q[l].dr]==ct[q[l+2].st][q[l+2].dr])
                || (ct[q[l].st][q[l].dr]==ct[q[l+3].st][q[l+3].dr]) || (ct[q[l].st][q[l].dr]==ct[q[l+4].st][q[l+4].dr]) || (ct[q[l].st][q[l].dr]==ct[q[l+5].st][q[l+5].dr]) || (ct[q[l].st][q[l].dr]==ct[q[l+6].st][q[l+6].dr])
                || (ct[q[l].st][q[l].dr]==ct[q[l+7].st][q[l+7].dr]) || (ct[q[l].st][q[l].dr]==ct[q[l+8].st][q[l+8].dr]) ) && (!stop))
            k++;}
    }
}
void scriere()
{
    minim=xx=yy=oo;
      for (i=1;i<=n;i++)
        for (j=1;j<=m;j++)
         if (ct[i][j]==cy[i][j] && ct[i][j]<=minim && ct[i][j]>0)
          if (ct[i][j]==minim) {if (xx>i || xx==i && yy>j) xx=i,yy=j;}
          else minim=ct[i][j],xx=i,yy=j;

    g<<minim<<xx<<yy;
   /* for (i=1;i<=n;i++){
        for (j=1;j<=m;j++)
        fprintf(g,"%d ",ct[i][j]);fprintf(g,"\n");}*/
}
int main()
{
    citire();
    solve(cy,Q,q2);
    solve(ct,q,q1);
    scriere();
    return 0;
}