Informatică, întrebare adresată de andreiutza2008, 8 ani în urmă

Se da o matrice m x n. Sa se stearga toate coloanele care contin cel mai mic numar din matrice.

Răspunsuri la întrebare

Răspuns de andriesboss92
0

Răspuns:

#include <iostream>

using namespace std;

int main()

{

   int m, n;

   cin >> m >> n;

   int a[m][n], minim;

   cin >> minim;

   a[0][0] = minim;

   

   for(int i = 0; i < m; i++ )

       for(int j = 0; j < n; j++ )

           {

               if ( i == 0 && j == 0 )

                   ;

               else

                   cin >> a[i][j];

                   

               if ( minim > a[i][j] )

                   minim = a[i][j];

           }

           

   for(int i = 0; i < m; i++ )

   {

       for(int j = 0; j < n; j++ )

       {

           if( a[i][j] == minim )

           {

               for(int l = 0; l < m; l++)

                   for(int k = j; k < n; k++ )

                       a[l][k] = a[l][k+1];

               n--;

               j--;

           }

       }

   }

   cout << endl;

   for(int i = 0; i < m; i++ )

   {

       for(int j = 0; j < n; j++ )

           cout << a[i][j] << " ";

       cout<<endl;

   }

}

Explicație:

Citesc numarul de linii si numarul de coloane.

Declar o matrice de exact m si n dimensiuni pentru a evita conflicte de lipsa memorie sau exces de memorie. Citesc prima valoare din matrice pentru ca fix aceea va fi si valoarea de la care vom pleca in a afla cel mai mic numar din matrice. Personal mi se pare cea mai buna metoda de a afla minimul deoarece folosesti doar numerele pe care le ai ( si nu prin atribuirea unei valori super mari variabilei minim ).

Atribuim elementului a [ 0 ] [ 0 ] valoarea minima intrucat am precizat anterior ca valoarea minima este fix primul numar din matrice. Ca sa evitam o suprascriere si o eroare de calcul vom conditiona ca atunci cand i si j sunt 0 sa nu se intample nimic, iar cand i sau j au valori diferite de 0 sa citim numerele din matrice. Practic prin secventa asta:

if ( i == 0 && j == 0 )

      ;

else

      cin >> a[i][j];

nu voi adauga pe pozitia [0][0] urmatorul numar citit.

Nu uita ca matricea poate avea doua numere minime in ea pe doua coloane diferite.

Asta inseamna ca trebuie sa taiem fiecare coloana pe care se afla elementele minime de aceeasi valoare.

Cum? Pai metoda care mi-a venit in minte a fost sa parcurg matricea de la inceput si in momentul in care am gasit ca elementul a[i][j] este egal cu valoarea minim aflata in momentul citirii fac urmatoarea chestie:

parcurg din nou matricea cu scopul de a taia coloana pe care se afla acel minim DUPA CARE continui sa parcurg matricea din punctul in care am ramas prin acel j--;. In urmatorul exemplu o sa intelegi de ce scad j-ul.

Se da matricea:

m = 3, n = 4

1 2 -2 -2

5 6 7 8

9 4 3 2

-2 este minimul. Peste coloana numarul 3 copiez coloana 4 si fac n--.

Matricea va fi

1 2 -2

5 6 7

9 4 3

Iar daca nu scad j care s-a facut j++ in interiorul instructiunii for va trece si va verifica daca 5 este egal cu minim deoarece coloana a 3 a fost deja distrusa ceea ce este incorect deoarece desi elementele initiale de pe coloana 3 au disparut, noua coloana 3 are acelasi minim in ea. Pentru a evita acest caz scadem j si verificam din nou coloana 3 daca elementul a[0][2] este minim. ( sa nu uitam ca citirea matricei s-a facut incepand de la 0 si de aceea numarul de ordine al coloanei este cu o unitate mai mic cu numarul de ordine al elementului a[][] din matrice ).

Dupa ce gaseste ca elementul a[0][2] este minim se va sterge si ultima linie va scade numarul de linii cu inca o unitate si se va afisa noua matrice formata din 3 linii si doua coloane.

1 2

5 6

9 4

Alte întrebări interesante