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
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
voidflatten(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\) */voidflatten(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];
}
}
}
intmain(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");
return1;
}
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);
return0;
}
Resposta
voidflatten(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];
}
}
}