👤
a fost răspuns

Buna ziua nu stiu cum sa rezolv urmatoarea problema:
Gigel s-a calificat la ONI 2007. Din pacate, sau din fericire, se intalneste iarasi cu o problema asemanatoare celei de la OJI, Excel.
Reamintim ca o foaie de calcul in Excel se prezinta sub forma unei suprafete liniate cu linii orizontale si verticale. Prin intersectia lor rezulta dreptunghiuri (numite celule), fiecare celula avand un nume format din una sau mai multe litere si un numar, reprezentand coloana, respectiv linia pe care se afla. De exemplu, celula din stanga sus este A1, urmata, pe linie, de B1, C1, ... , Z1, AA1, AB1, .. . BA1, ... .

 A B ... Z AA AB ... AZ BA ...
1 A1 B1 ... Z1 AA1 AB1 ... AZ1 BA1 ...
2 A2 B2 ... Z2 AA2 AB2 ... AZ2 BA2 ...
3 A3 B3 ... Z3 AA3 AB3 ... AZ3 BA3 ...
... ... ... ... ... ... ... ... ... ... ...
Cerinta

Dandu-se mai multe celule sub forma LxCy, precum si valorile aflate in aceste celule, sa se afiseze numele celulelor folosind codificarea standard explicata mai sus.
Se defineste o foaie Excel ca fiind delimitata de linia 1, coloana 1, linia n, coloana m si se completeaza aceasta foaie cu valorile aflate in celulele descrise anterior. Indicii n si m reprezinta indicele celei mai mari linii, respectiv coloane in care exista o valoare diferita de zero. In aceasta foaie se realizeaza insumarea valorilor la prima coloana. Se cere sa se afiseze rezultatele obtinute in aceasta coloana incepand cu celula A1 pana in celula An.
Date de intrare

Fisierul excel.in contine mai multe linii, fiecare fiind de forma:
LxCy val unde LxCy reprezinta o celula data prin linia x, respectiv coloana y, iar val valoarea numerica pe care o contine aceasta celula. 
Date de ieşire

Fisierul excel.out va contine cate o linie corespunzatoare fiecarei linii din fisierul de intrare. Pe fiecare linie se va scrie numele celulei corespunzatoare din fisierul de intrare in formatul descris in enunt (ColoanaLinie). In plus fisierul de iesire va mai contine o linie ce va descrie coloana A, obtinuta in urma operatiilor de insumare. Pe aceasta coloana fiind mai multe valori dintre care foarte multe valori nule, se vor afisa: valoarea din celula Ak daca exista o valoare numerica diferita de 0, sau nr 0, unde nr reprezinta cate valori 0 consecutive sunt intre doua celule Ai Aj, unde i Restricţii

1 ≤ indicele de linie(x) ≤ 30 000 000
1 ≤ indicele de coloană(y) ≤ 30 000 000
Foaia de calcul, înainte de citirea fişierului de intrare, se consideră a fi "umplută" cu valoarea zero.
-32 000 ≤ val ≤ 32 000
În fişierul de intrare sunt cel mult 300 de linii.
Între LxCy şi val există un singur spaţiu.
Fişierul de intrare va contine, după ultima linie, Enter.
Se acordă 30% din punctaj pentru afişarea corectă a numelor celulelor descrise în fişierul de intrare.


Răspuns :

#include <iostream>

#include <fstream>

#include <string.h>

#include <stdlib.h>

using namespace std;

ifstream f("excel.in");

ofstream g("excel.out");

int suma[320][320][320];

int main()

{

char LxCy[20], numecel[255], *p;

int val, i, j, L, C, k, x, y, a, b, c, Lmax=-1, nr, L1, L2;

while(!f.eof())

{

 f>>LxCy>>val;

 p=strtok(LxCy,"LC");

 L=atoi(p);

 p=strtok(NULL,"LC");

 C=atoi(p);

 k=0;

 numecel[0]='A';

 numecel[1]='\0';

 for(j=2;j<=C;j++)

 {

  if(numecel[k]<'Z')

   numecel[k]++;

  else{

   bool schimbat=0;

   for(x=k;x>=0;x--)

    if(numecel[x]!='Z')

    {

     numecel[x]++;

     schimbat=1; y=x;

     break;

    }

   if(schimbat==0){

    k++;

    for(x=0;x<=k;x++)

     numecel[x]='A';

    numecel[k+1]='\0';

   }

   if(schimbat==1){

    x=k;

    while(numecel[x]=='Z' && y<x){

     numecel[x]='A';

     x--;

    }

   }

  }

 }

 a=1; b=1; c=0;

 for(i=1;i<=L;i++){

  c++;

  if(c==1000)

   if(b==999){

    a++; b=1; c=1;}

   else{

    b++; c=1;

   }

 }

 suma[a][b][c]+=val;

 g<<numecel<<L<<'\n';

 if(Lmax<L)

  Lmax=L;

}

nr=0;

for(i=1;i<=Lmax;i++){

 a=1; b=1; c=0;

 for(j=1;j<=i;j++){

  c++;

  if(c==1000)

   if(b==999){

    a++; b=1; c=1;

   }

   else{

    b++; c=1;

   }

 }

 if(suma[a][b][c]!=0)

 {

  if(nr!=0){

   g<<nr<<' '<<0<<' '; nr=0;

  }

  g<<suma[a][b][c]<<' ';

 }

 else nr++;

}

return 0;

}