Cod sursa(job #75990)

Utilizator FlorianFlorian Marcu Florian Data 7 august 2007 12:15:04
Problema Rj Scor Ascuns
Compilator cpp Status done
Runda Marime 3.08 kb
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define Max 103
FILE*f=fopen("rj.in","r");
FILE*g=fopen("rj.out","w");
int r[Max][Max],j[Max][Max],n,m,xr,yr,xj,yj;
int dx[8]={0,0,1,1,1,-1,-1,-1};
int dy[8]={1,-1,0,-1,1,1,0,-1};
void read()
        {
        char c;
        int p,i;
        fscanf(f,"%d %d\n",&n,&m);
        for(i=1;i<=n;++i)
           {
                for(int p=1;p<=m;++p)
                        {
                       c=fgetc(f);
                if(c=='X') { r[i][p]=-2;   j[i][p]=-2;}
                else if (c=='R') { r[i][p]=0; j[i][p]=-2; xr=i; yr=p;}
                else if (c=='J') { j[i][p]=0; r[i][p]=-2; xj=i; yj=p;}
                else if(c==' ') { r[i][p]=-1; j[i][p]=-1;}
                }
                c=fgetc(f);
           }

       }
void det_drum(int x,int y,int d[Max][Max])
        {
        int c[60000][2];
        int inc,sf,p,k,i;
        inc=sf=0;
        c[0][0]=x;
        c[0][1]=y;
        while(inc<=sf)
                {
                x=c[inc][0];
                y=c[inc++][1];
                for(i=0;i<8;++i)
                        {
                        p=x+dx[i];
                        k=y+dy[i];
                        if(d[p][k]==-1)
                                {
                                d[p][k]=d[x][y]+1;
                                c[++sf][0]=p;
                                c[sf][1]=k;
                                }
                         }
                  }

          }
void solve()
        {
        det_drum(xr,yr,r);
        det_drum(xj,yj,j);
        }
void debug()
        {
        for(int i=1;i<=n;++i)
                {
                for(int jj=1;jj<=m;++jj)
                fprintf(g,"%d ",r[i][jj]);
                fprintf(g,"\n");
                }
       fprintf(g,"\n");
       for(int i=1;i<=n;++i)
                {for(int jj=1;jj<=m;++jj)
                fprintf(g,"%d ",j[i][jj]);
                fprintf(g,"\n");
                }
         }
void bordare()
        {
        for(int i=0;i<=n+1;++i)
               {
               r[i][0]=-2; r[i][m+1]=-2;
               }
        for(int i=0;i<=m+1;++i) { r[0][i]=-2; r[n+1][i]=-2;}
         for(int i=0;i<=n+1;++i)
               {
               j[i][0]=-2; j[i][m+1]=-2;
               }
        for(int i=0;i<=m+1;++i) { j[0][i]=-2; j[n+1][i]=-2;}
        }
void search_min()
        {
        int i,jj,min,p,k;
        min=30000;
        p=-1; k=-1;
        for(i=1;i<=n;++i)
                for(jj=1;jj<=m;++jj)
                 if(r[i][jj]==j[i][jj]&&r[i][jj]!=-2)
                         {
                         if(min>r[i][jj])
                                {
                                min=r[i][jj];
                                p=i;
                                k=jj;
                                }
                         }
         fprintf(g,"%d %d %d\n",min,p,k);
         }
int main()
        {
        read();
        bordare();
        solve();
        search_min();
        debug();
        return 0;
        }