Сортировка матрицы по четным числам в строках - PullRequest
0 голосов
/ 15 апреля 2020

Хорошо, я только начинаю пользоваться этим сайтом, и я знаю, что мой заголовок немного запутанный, но я постараюсь объяснить его здесь как можно лучше. Поэтому мне нужно взять матрицу из входных данных, сосчитать четные и нечетные числа в каждой строке, а затем написать матрицу со строками, в которых сначала будет больше четных чисел. Пример:

Ввод:

3 3 // Размеры

1 2 3 // Элементы

4 5 6

7 8 9

Вывод:

1 2 3 // Исходная матрица

4 5 6

7 8 9

1 2 // Количество четных и нечетных элементов в каждой строке

2 1

1 2

4 5 6 // Матрица, отсортированная по четным числам в строках

1 2 3

7 8 9

Я сделал все, кроме выяснения, как выписать окончательную матрицу. Любая помощь?

#include<stdio.h>
#include<stdlib.h>


int main() {

    int row, column, temp, count;
    int even[100], odd[100];

    for (int i = 0; i < 100; i++)
        even[i] = odd[i] = 0;

    scanf("%d %d", &row, &column);
    count = row;

    int* matrix = (int*)malloc(row * column * sizeof(int));

    for (int i = 0; i < row; i++)
        for (int j = 0; j < column; j++)
            scanf("%d", &*(matrix + i * column + j));

    for (int i = 0; i < row; i++) {
        for (int j = 0; j < column; j++)
            printf("%d ", *(matrix + i * column + j));
        printf("\n");
    }

    for (int i = 0; i < row; i++) {
        for (int j = 0; j < column; j++) {
            temp = *(matrix + i * column + j);
            if (temp % 2 == 0)
                even[i]++;
            else odd[i]++;
        }
    }

    for (int i = 0; i < count; i++)
        printf("%d %d\n", even[i], odd[I]);


    return 0;
}

Если есть какие-то ошибки с именами переменных, я переводил большинство из них здесь напрямую, поэтому, возможно, я пропустил некоторые из них, извините заранее.

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Вы можете сначала создать функцию swap, а затем сравнить четное значение между строками.

// Swap 2 elements
void swap_elt(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

// swap row m and row n
void swap(int *matrix, int m, int n, int column) {
    for (int j = 0; j < column; ++j)
    {
        swap_elt(matrix + m * column + j, matrix + n * column + j);
    }
    return;
}

Значение для l oop для сравнения четного значения между строками:

for (int i = 0; i < count; i++) {
        for (int j = i; j < count; j++)
        {
            if (even[i] < even[j]) {
                swap(matrix, i, j, column);
            }
        }
    }

Тест:

3 3 
1 2 3
4 5 6
7 8 9
1 2 3 
4 5 6 
7 8 9 
1 2
2 1
1 2
4 5 6 
1 2 3 
7 8 9
0 голосов
/ 16 апреля 2020

Я не скажу, что это 100% ответ, но я старался изо всех сил (Извините, что мое решение немного отличается, я думаю, что понимаю ваш вопрос, но я не могу сделать свой ответ лучше. Редактировать: Я Также включите идею user3386109 (внизу моего ответа).

#include <stdio.h>

int main ()
{
    int row, col;
    scanf ("%d %d%*c", &row, &col);

    int mtx[row][col];
    for (int x=0; x<row; x++)
    {
        for (int y=0; y<col; y++) scanf ("%d%*c", &mtx[x][y]);
    }

    //Printing the original matrix
    for (int x=0; x<row; x++)
    {
        for (int y=0; y<col; y++)
        {
            if (y) printf (" %d", mtx[x][y]);
            else printf ("%d", mtx[x][y]);
        }
        printf ("\n");
    }

    int odd[row], even[row];            //Make a var to store odd/even value each row
    for (int x=0; x<row; x++)
    {
        odd[x]=even[x]=0;               //Set to 0 before doing an operation, for safety
        for (int y=0; y<col; y++)
        {
            if (mtx[x][y]%2) odd[x]++;  //If it is odd, odd[which_row] incremented
            else even[x]++;             //Else, even gets incremented
        }
        printf ("%d %d\n", even[x], odd[x]);
    }

    int temp;
    for (int x=0; x<row-1; x++)
    {
        for (int y=x+1; y<row; y++)
        {
            if (even[x]<even[y])            //Same "concept" like bubble sort
            {
                for (int z=0; z<col; z++)
                {
                    temp=mtx[x][z];         //Swapping the content of the matrix
                    mtx[x][z]=mtx[y][z];
                    mtx[y][z]=temp;
                }
                temp=even[x];               //Swap the value of even[x]
                even[x]=even[y];
                even[y]=temp;
            }
        }
    }

    //Print the result
    for (int x=0; x<row; x++)
    {
        for (int y=0; y<col; y++)
        {
            if (y) printf (" %d", mtx[x][y]);
            else printf ("%d", mtx[x][y]);
        }
        printf ("\n");
    }

    return 0;
}

Пример ввода-вывода:

3 3
1 3 5
7 4 6
2 9 3
1 3 5
7 4 6
2 9 3
0 3
2 1
1 2
7 4 6
2 9 3
1 3 5

Идея user3386109:

for (int x=maxEven; x>=0; x--)
{
    for (int y=0; y<row; y++)
    {
        if (even[y]==x)
        {
            for (int z=0; z<col; z++)
            {
                if (z) printf (" %d", mtx[y][z]);
                else printf ("%d", mtx[y][z]);
            }
            printf ("\n");
            break;
        }
    }
}
...