Matrius esparses (2): transposició Y91345


Statement
 

pdf   zip   tar

Tal com vam veure al problema Matrius esparses (1): conversió, una matriu esparsa només emmagatzema els elements no nuls. Els tipus usats (definits a matrius.hh) són els mateixos:

struct Casella {
    int pos;    // índex de columna
    int valor;  // valor de l'element
};

struct MatriuEsparsa {
    int ncols;                   // nombre de columnes
    vector<list<Casella>> files; // files de la matriu esparsa
};

La transposada d’una matriu n×mn \times m és la matriu m×nm \times n que s’obté intercanviant files i columnes: l’element a la posició (i,j)(i, j) de l’original passa a la posició (j,i)(j, i) de la transposada.

Fes la funció següent:

/**
 * @brief Calcula la transposada d'una MatriuEsparsa.
 *
 * @param S MatriuEsparsa de S.files.size() files i S.ncols columnes.
 *
 * @pre S és una MatriuEsparsa vàlida. Les posicions de les caselles van de 0 a S.ncols-1.
 * @post Retorna una nova MatriuEsparsa T amb T.ncols == S.files.size() i
 *       T.files.size() == S.ncols, on T.files[j] conté les caselles
 *       {i, S.files[i][j].valor} de S, ordenades per columna ascendentment.
 */
MatriuEsparsa matriu_esparsa_transposa(const MatriuEsparsa& S);

Observació

Els fitxers públics (icona del gatet) contenen:

main.cc el programa principal, amb la entrada/sortida feta
matrius.hh els tipus Casella i MatriuEsparsa
Makefile per compilar amb make còmodament
.vscode carpeta per compilar i depurar amb VSCode

Cal enviar únicament la implementació de la funció matriu_esparsa_transposa, incloent-hi l’include de matrius.hh. No cal enviar el main.

Entrada

La primera línia conté dos enters nn i mm (0n,m10000 \leq n, m \leq 1000), el nombre de files i columnes de la matriu esparsa d’entrada. A continuació hi ha nn línies, cadascuna amb les caselles no nul·les de la fila com a parelles (col,val) separades per espais, seguides d’un punt .. Les files sense elements no nuls es representen com ..

Sortida

La matriu esparsa transposada en el mateix format que l’entrada: la primera línia conté les dimensions m×nm \times n de la transposada, seguida de mm línies amb les caselles no nul·les de cada fila, seguides d’un punt ..

Public test cases
  • Input

    3 4
    (1,3).
    (2,5).
    (0,1) (3,7).
    

    Output

    4 3
    (2,1).
    (0,3).
    (1,5).
    (2,7).
    
  • Input

    4 4
    (0,1) (3,2).
    .
    (1,-3).
    (0,5) (2,6).
    

    Output

    4 4
    (0,1) (3,5).
    (2,-3).
    (3,6).
    (0,2).
    
  • Information
    Author
    Pau Fernández
    Language
    Catalan
    Other languages
    Spanish
    Official solutions
    C++
    User solutions
    C++