Cod sursa(job #1621348)

Utilizator Flavius08Flavius Aga Flavius08 Data 29 februarie 2016 18:33:20
Problema Rj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.87 kb
#include <fstream>
#include <sstream>
#define nMax 100
#define mMax 100
#define DEBUG 0
#define DB if(DEBUG)
#define toupper1(c)   ((c>='a' && c<'z')?c-'a'+'A':c)
using namespace std;

int N,M,dcrt=0,vmax=(nMax+1)*(mMax+1)+1;
int X=vmax+'X',  Spatiu=vmax+' ';
int oras[nMax+1][mMax+1],copieOras[nMax+1][mMax+1];
int iR, jR, iJ, jJ, iIntalnire=X, jIntalnire=X;
int di[]={1,0,-1,-1,-1,0,1,1};
int dj[]={-1,-1,-1,0,1,1,1,0};

void citiremat(char numefis[])
{
  int i,j,k=0, jcmin, lngLinie;
  char cc;
  string  linie;
  ifstream in(numefis);
  in>>N>>M;
  getline(in,linie);
  DB printf("N=%d M=%d\n",N,M);

  for(i=1;i<=N;i++){
    // linia i
    for(j=1;j<=M;j++) // init linia i
        copieOras[i][j]=oras[i][j]=Spatiu;
    getline(in,linie);
    lngLinie = linie.length();
    jcmin = M; //<=lngLinie ? M:lngLinie;
    for(j=1;j<=jcmin;j++)
    {
        cc=linie[j-1];
        if(cc==0 || cc=='\r' || cc=='\n') break;
        if(cc==EOF) goto Final;

        DB k++;
        DB printf("%c",cc==' '?'.':cc);

        cc=toupper1(cc);
        if(cc=='X'||cc=='R'||cc=='J'||cc==' ')
                copieOras[i][j]=oras[i][j]=vmax+cc;
        if(cc=='R') {
                iR=i;
                jR=j;
        }
        else if(cc=='J') {
                iJ=i;
                jJ=j;
            }
        }
        DB printf("  --jcmin=%d\n", jcmin);
        linie="";
  }
  Final: DB printf(" iR=%d jR=%d iJ=%d jJ=%d k=%d ********\n", iR, jR, iJ,
jJ, k);
}

void afismat(char * numefis, int town[][mMax+1])
{
    ofstream out(numefis);
    int i,j;
    DB printf("\n");
    for(i=1;i<=N;i++)
    {
        out<<endl;
        DB printf("\n");
        for(j=1;j<=M;j++) {
           out<<town[i][j]<<" ";
           DB {
               if(town[i][j]>vmax)
                    printf(" %c ",town[i][j]-vmax);
               else printf("%2d ",town[i][j]);
           }
        }
    }
}
// ----------------------------------------------
int coada[nMax*mMax], kPrim=0,kUltim=0;
void treceInCoada(int i, int j){
   coada[kUltim++]=i*(M+1)+j;
}
int extragePrimul(int *j){
   int i=coada[kPrim]/(M+1);
   *j= coada[kPrim]%(M+1);
   kPrim++;
   return i;
}
// ----------------------------------------------
void distante(int oras[][mMax+1], int iStart, int jStart, int iStop, int
jStop){
    int k, iv, jv, oc, dcrt ;
    int iCrt,jCrt;

    treceInCoada(iStart, jStart);
    oras[iStart][jStart]=1;
  while (kPrim<kUltim) { // coada nu este vida
    iCrt = extragePrimul(&jCrt);
    if (iCrt == iStop && jCrt == jStop)
        break;
    dcrt = oras[iCrt][jCrt] + 1;
    DB printf("\nicrt=%d jcrt=%d  dcrt=%d", iCrt,jCrt,dcrt);
    DB afismat("rjinit1.out", oras);

    for(k=0;k<8;k++){
        iv=iCrt+di[k];
        if(iv<1||iv>N) continue;
        jv=jCrt+dj[k];
        if(jv<1||jv>M) continue;
        oc=oras[iv][jv];
        if(oc==X) continue;
        if(oc > dcrt) { //nevizitat
            treceInCoada(iv, jv);
            oras[iv][jv]= dcrt;
        }
    }
  }
}

int cautaPunctDeIntalnire(){
   int i, j, oc, coc, tmin=vmax;

    for (i=1; i<=N; i++)
      for (j=1; j<=M; j++) {
        coc=copieOras[i][j];
        oc=oras[i][j];
        if (oc==X || oc==Spatiu) continue;
        if( oc==coc && oc< tmin) {
            tmin=oc;
            iIntalnire=i;
            jIntalnire=j;
        }
      }
    return tmin;
}

int main()
{   int tmin;

    citiremat("rj.in");
    distante(oras, iR,jR, iJ, jJ);     // drumuri Romeo -> Julieta
    distante(copieOras, iJ,jJ, iR,jR); // drumuri Julieta -> Romeo
    tmin= cautaPunctDeIntalnire();
    ofstream out("rj.out");
    out<< tmin << " " <<iIntalnire<<" " <<jIntalnire;

   // doar pt. DEBUG 1
    DB printf("********** R O M E O *************");
    DB afismat("rj.out", oras);
    DB printf("********** J U L I E T A *************");
    DB afismat("rj.out",copieOras);
    DB printf(" Intalnire=(%d, %d)",iIntalnire,jIntalnire);
    DB printf("\n%d %d %d",tmin,iIntalnire,jIntalnire);

    return 0;
}