Probleme de informatica - enunturi si rezolvari

Probleme de informatică
Clasa a IX-a
Elementele de bază C++ (46)
Subprograme predefinite (1)
Fişiere text (2)
Algoritmi elementari (111)
Tablouri unidimensionale (83)
Tablouri bidimensionale (64)
Probleme diverse (13)
Clasa a X-a
Subprograme (funcții) (87)
Şiruri de caractere (50)
Tipul înregistrare (26)
Recursivitate (57)
Alocarea dinamică a memoriei (2)
Liste înlănţuite (25)
Algoritmul lui Lee (1)
Clasa a XI-a
Metoda "Divide et impera" (12)
Metoda Backtracking (86)
Metoda Greedy (6)
Programare dinamică (18)
Grafuri neorientate (40)
Grafuri orientate (38)
Arbori (33)
Clasa a XII-a
Elemente de bază C# (32)
POO în C# (14)
Programare vizuală în C# (19)
Examen de bacalaureat
Competențe digitale
Examen de atestat
Admitere UBB (18)
Din fisierul cub.in se citesc de pe prima linie 2 numere naturale n si m si de pe urmatoarele n linii n perechi l si c unde l este lungimea laturii, iar c culoarea pentru n cuburi. l este numar natural, iar c este sir de caractere de lungime maxim 20. Sa se construiasca toate turnurile formate din cel putin m cuburi care se pot forma din cuburile citite din fisier stiind ca un cub se poate pune peste un altul doar daca are latura strict mai mica si culoarea diferita de a celui peste care vrem sa îl punem. Sa se afiseze turnurile obtinute si turnul format din cele mai multe cuburi. Un turn se afiseaza începând cu cel mai de sus cub.
Exemplu:
3 2
3 verde
4 rosu
1 rosu
Se obtin turnurile:
1 rosu
3 verde

3 verde
4 rosu
si
1 rosu
3 verde
4 rosu

#include<fstream.h>
#include<string.h>

struct cub{
	    int l;
	    char c[20];
	  };
cub c[100];

int x[100],mx[100],max=0,n,m;
ifstream f("cub.in");

void citire()
{ int i;
  f>>n>>m;
  for(i=1;i<=n;i++) f>>c[i].l>>c[i].c;
}

void scriesol(int k)
{ int j;
  if(k>max) { max=k;
       for(j=1;j<=max;j++) mx[j]=x[j];
       }
  for(j=k;j>=1;j--)
    cout<<c[x[j]].l<<" "<<c[x[j]].c<<endl;
  cout<<endl;
}

int cond(int k)
{
  if(k>1)
     if(c[x[k-1]].l>c[x[k]].l)
	if(strcmp(c[x[k-1]].c,c[x[k]].c)!=0) return 1;
	else return 0;
     else return 0;
  else return 1;
}

void back(int k)
{
  int i;
  for(i=1;i<=n;i++)
   {
       x[k]=i;
       if (cond(k))
	    { if (k>=m) scriesol(k);
	      back(k+1);
	    }
   }
}

void main()
{
 citire();
 back(1);
 cout<<"Cel mai inalt turn:";
 for(int j=max;j>=1;j--)
    cout<<c[mx[j]].l<<" "<<c[mx[j]].c<<endl;
}

21 nov 2024
Site-ul conține 884 de probleme rezolvate
Copyright © 2009-2018 Muresan Vasile Ciprian