Поместить наибольший элемент матрицы в левый верхний угол, переставляя СТРОКИ и СТОЛБЦЫ

Мой код решает эту задачу:

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

int main()
{
    int i, j, n, k, Ni, Nj, t;
    Ni = 8;
    Nj = 5;
    float A[8][5];
    float max = 99;
    float min = 1;
    float element = 0;
    srand(time(NULL));
    for (i = 0; i < Ni; i++)
    {
        for (j = 0; j < Nj; j++)
        {
            A[i][j] = (float)rand() / RAND_MAX * (max - min) + min;
            if (A[i][j] > element) element = A[i][j], n = i, k = j;
            printf("\t%.1f", A[i][j]);
        }
        printf("\n");
    }
    printf("\n%.1f, i=%d, j=%d", element, n, k);

    //sorting

    for (i = 0; i < Ni; i++)
    {
        if (i == n)
        {
            for (j = 0; j < Nj; j++)
            {
                t = A[0][j];
                A[0][j] = A[i][j];
                A[i][j] = t;
            }
        }
    }

    for (j = 0; j < Nj; j++)
    {
        if (j == k)
        {
            for (i = 0; i < Ni; i++)
            {
                t = A[i][0];
                A[i][0] = A[i][j];
                A[i][j] = t;
            }
        }
    }

    printf("\nSorted Array\n");
    for (i = 0; i < Ni; i++)
    {
        for (j = 0; j < Nj; j++)
        {
            printf("\t%.1f", A[i][j]);
        }
        printf("\n");
    }

    return 0;
}

Однако перестановка в два отдельных цикла (после \sorting) слишком долгая, хотелось бы организовать это в 1 внешний и 2 вложенных цикла примерно вот так:

//sorting

    for (int s = 0; s < 2; s++)
    {
        m = 0;
        for (i = 0; i < Ni; i++)
        {
            if (i == n)
            {
                for (j = 0; j < Nj; j++)
                {
                    p = j;
                    v = i;
                    if (s == 1)
                    {
                        //switch rows and columns
                        p = i;
                        v = j;
                        
                        //switch columns and rows
                        u = j;
                        j = m;
                        m = u;
                    }

                    t = A[m][j];
                    A[m][j] = A[v][p];
                    A[v][p] = t;
                }
            }
        }
        y = Ni;
        Ni = Nj;
        Nj = y;
        n = k;
    }

И это работает! Но с багом. В матрице появляется огромное число не из заданного диапазона, либо выскакивает исключение Run-Time Check Failure #2 - Stack around the variable 'A' was corrupted. А сама матрица итоговая выглядит так:

введите сюда описание изображения

ВОПРОС: как организовать перестановку строк и столбцов быстрее, как во втором примере, но без багов


Ответы (1 шт):

Автор решения: DmitryK

Что-то вы намудрили с циклами.
Вот эта конструкция не имеет смысла, т.к выполнится только один раз:

 for (i = 0; i < Ni; i++) // цикл не имеет смысла, т.к. действия внутри выполнятся 1 раз
 {
        if (i == n)
        {}
 }   

И если переписать, то ваши вложенные циклы из первого примера, станут одним циклом:

for (j = 0; j < Nj; j++) // обмен строк
{
    t = A[0][j];
    A[0][j] = A[n][j];
    A[n][j] = t;
}
for (i = 0; i < Ni; i++)  // обмен столбцов
{
    t = A[i][0];
    A[i][0] = A[i][k];
    A[i][k] = t;
}

А чтобы упростить код, можно использовать функцию swap():

for (j = 0; j < Nj; j++) // обмен строк
    swap( A[0][j], A[n][j]); 

for (i = 0; i < Ni; i++)  // обмен столбцов
    swap( A[i][0], A[i][k]); 

И короче сделать нельзя! И она не долгая! Она работает линейно за О(Ni+Nj)
А ошибка ваша выскакивает из-за того, что количество элементов в строках не равно количеству элементов в столбцах и вы выходите за пределы массива, потому что из-сложности кода намудрили с пределами в циклах.
Второй вариант не быстрее - точно так же у вас в итоге 2 цикла, в одном обмениваете строки, в другом - столбцы.

→ Ссылка