Me gustaría comprimir una matriz 2d de la siguiente entrada

Enter the array size (rowSize, colSize):
4 4
Enter the matrix (4x4):
1 1 1 0
0 0 1 1
1 1 1 1
0 0 0 0

A esto, donde se especifica el número de unos y ceros.

compress2D():
1 3 0 1
0 2 1 2
1 4
0 4 

El siguiente es mi código

void compress2D(int data[SIZE][SIZE], int rowSize, int colSize)
{
int i , j , counter = 0, tempInt = data[0][0];
for (i = 0 ; i < rowSize ; i++)
{
    for (j = 0 ; j < colSize ; j++ )
    {
        if (data[i][j] == tempInt) 
            counter++ ; 
        else
        {
            printf("%d %d " , tempInt,counter);
            tempInt = data[i][j];
            counter = 1;

        }   
    }
    if(counter!=0)
        printf("%d %d",tempInt, counter);
    counter = 0 ;
    printf("\n");
}
}

Sin embargo esta es mi salida

compress2D(): 
1 3 0 1
0 2 1 2
1 4
1 0 0 4

Todas las entradas serán binarias

Cualquier ayuda sería muy apreciado!

c
2
Joey Ngo 14 feb. 2018 a las 08:32

2 respuestas

La mejor respuesta

Como se menciona en los comentarios, debe restablecer tempInt cada vez que comienza una nueva fila

void compress2D(int data[SIZE][SIZE], int rowSize, int colSize)
{
    int i, j, counter = 0, tempInt = data[0][0];
    for (i = 0; i < rowSize; i++)
    {
        tempInt = data[i][0];                        // <--------

        for (j = 0; j < colSize; j++)
        {
            if (data[i][j] == tempInt)
                counter++;
            else
            {
                printf("%d %d ", tempInt, counter);
                tempInt = data[i][j];
                counter = 1;

            }
        }
        if (counter != 0)
            printf("%d %d", tempInt, counter);
        counter = 0;
        printf("\n");
    }
}
1
Stephen Docy 14 feb. 2018 a las 06:00

Puede utilizar el siguiente código. Véalo en funcionamiento aquí:

void compress2D(int data[SIZE][SIZE], int rowSize, int colSize)
{
    int i , j , counter, tempInt;
    for (i = 0 ; i < rowSize ; i++)
    {
        tempInt = data[i][0];
        counter = 1;

        for (j = 1 ; j < colSize ; j++ )
        {
            if (data[i][j] == tempInt) 
                counter++ ; 
            else
            {
                printf("%d %d " , tempInt,counter);
                tempInt = data[i][j];
                counter = 1;
            }   
        }
        if(counter)
            printf("%d %d",tempInt, counter);
        printf("\n");
    }
}

Nota: actualizado después del último comentario de OP ( 0 1 1 2 0 1, hay algunos casos en los que la salida será más larga que la entrada en sí ).

2
cse 14 feb. 2018 a las 10:03