Como matrizes são estruturas de dados 2D, trabalhar com elas nessa forma pode ser trabalhoso. Dependendo da tarefa, trabalhar com um vetor gigante pode ser até mais fácil. A operação de flatten, planificação em português, recebe como entrada uma matriz e a converte para um vetor de 1 Dimensão. Por exemplo, na matriz
M=[ccc 1 & 5 & 1 4 & 4 & 46 3 & 12 & 17 ]
a operação de flatten tem como saída o vetor [1,5,1,4,4,46,3,12,17]. Implemente a operação flatten em C.

Passo 1

O enunciado pede para implementar em C a operação de flatten, que transforma uma matriz 2D em um vetor 1D. O conteúdo envolve aritmética de índices e percorrer estruturas bidimensionais com loops aninhados.

Passo 2

Para “linearizar” a matriz no formato row-major, usamos dois loops for: um percorre as linhas e outro percorre as colunas. Se a matriz tem rows linhas e cols colunas, o elemento M[i][j] deve ir para a posição k \(=\) i*cols \(+\) j do vetor resultante.

Passo 3

Com base nisso, definimos uma função com protótipo
void flatten(int rows, int cols, int M[rows][cols], int *v);
Dentro dela, mantemos um índice idx que começa em zero e a cada atribuição em v[idx\(++\)] copiamos o elemento correspondente de M.

Passo 4

Abaixo está a implementação completa e um exemplo de uso:
#include <stdio.h>
#include <stdlib.h>

/* Flatten: converte matriz \(M[rows][cols]\) em vetor \(v\) de tamanho \(rows \times cols\) */
void flatten(int rows, int cols, int M[rows][cols], int *v) {
    int idx = 0;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            v[idx++] = M[i][j];
        }
    }
}

int main(void) {
    int M[3][3] = {
        {1, 5, 1},
        {4, 4, 46},
        {3, 12, 17}
    };
    int rows = 3, cols = 3;
    int *v = malloc(rows * cols * sizeof(int));
    if (v == NULL) {
        perror("malloc");
        return 1;
    }

    flatten(rows, cols, M, v);

    /* Imprime o vetor resultante */
    for (int k = 0; k < rows*cols; k++) {
        printf("%d%s", v[k], (k < rows*cols-1) ? "," : "\n");
    }

    free(v);
    return 0;
}

Resposta

void flatten(int rows, int cols, int M[rows][cols], int *v) {
    int idx = 0;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            v[idx++] = M[i][j];
        }
    }
}

Exercícios relacionados