Cod sursa(job #2171016)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 15 martie 2018 10:51:20
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
#include <deque>
#include <cstring>

using namespace std;

ifstream fin("mxl.in");
ofstream fout("mxl.out");

int N,K;
int mat[50][50];
int lg[50][50];
int ord[50][50];
int x[2500],y[2500];
char s[2500][260];

void Read()
{
  fin>>N>>K;

  for(int i=1; i<=K; ++i)
  {
    fin>>x[i]>>y[i];
    fin>>s[i];
    ord[x[i]][y[i]]=i;
    lg[x[i]][y[i]]=strlen(s[i]);
  }

   fin.close();
}

int getNumber(char e[],int &cursor)
{
   int val=0;

   while(isdigit(e[cursor]))
   {
     val*=10;
     val+=e[cursor]-'0';

     ++cursor;
   }

  --cursor;

  return val;
}

int Find(int L,int C)
{
   int k=ord[L][C];
   int lgs=lg[L][C];

   if(lgs==0) lgs=strlen(s[k]);

   deque <int> valori;

   int nr;
   int l,c;

   for(int i=0; i<lgs; ++i)
   {
     if(isdigit(s[k][i]))
      {
        nr=getNumber(s[k],i);
        valori.push_back(nr);
      }
     if(s[k][i]==':')
     {
       l=valori.back();
       valori.pop_back();

       ++i;
       c=getNumber(s[k],i);

       nr=Find(l,c);
       valori.push_back(nr);
     }
   }

   nr=0;

   while(!valori.empty())
   {
     nr+=valori.back();
     valori.pop_back();
   }

   mat[L][C]=nr;
   return nr;
}

void Do()
{
   for(int i=1; i<=K; ++i)
     if(mat[x[i]][y[i]]==0)
      Find(x[i],y[i]);
}

void Print()
{
  for(int i=1; i<=N; ++i)
  {
    for(int j=1; j<=N; ++j) fout<<mat[i][j]<<' ';

    fout<<'\n';
  }
}

int main()
{
   Read();
   Do();
   Print();

    return 0;
}