Поместить наибольший элемент матрицы в левый верхний угол, переставляя СТРОКИ и СТОЛБЦЫ
Мой код решает эту задачу:
#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 шт):
Что-то вы намудрили с циклами.
Вот эта конструкция не имеет смысла, т.к выполнится только один раз:
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 цикла, в одном обмениваете строки, в другом - столбцы.
