Informatică, întrebare adresată de Utilizator anonim, 8 ani în urmă

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.


Daniel4761: Nu ai exemplu, nu?
Utilizator anonim: in:
Utilizator anonim: L1C1 23
L3C1 100
L1C3 -100
L29999999C26 50
L52C52 25
L53C17576 24
L53C17602 100
Utilizator anonim: out:
Utilizator anonim: A1
A3
C1
Z29999999
AZ52
YYZ53
YZZ53
-77 1 0 100 48 0 25 124 29999945 0 50
Utilizator anonim: explicatie:
Utilizator anonim: A1: 23-100=-77
A2: 0 => 1 0
A3: 100
A4 – A51: 0 => 48 0
A52: 25
A53: 24+100=124
A54 – A29999998: 0 => 29999945 0
A29999999: 50
Daniel4761: Am inteles acum ce trebuie facut mersi

Răspunsuri la întrebare

Răspuns de Daniel4761
2

#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;

}

Alte întrebări interesante