Двумерные массивы - Поменять местами столбцы с минимальной и максимальной суммой элементов
Помогите пожалуйста новичку с задачей. Проблема заключается в том, что у меня не получается определить минимумы и максимумы для столбца. Я упускаю что-то очевидное из-за чего не могу продвинуться дальше к решению непосредственно на замену максимума и минимума. Если запустить код, то максимум обозначается верно, но минимум считывает первое число и на этом все. Что тут не так? Стоит так же добавить, что я перепробовал очень много всего, ставил условия, менял обозначения мин макс между внутренними и внешними циклами и другое, в лучшем случае максимум по столбику есть.
Задача: Поменять местами столбцы с минимальной и максимальной суммой элементов.
Входные данные: Два натуральных числа NN и MM. Далее с новой строки NN строк по MM целых чисел в каждой. NN и MM не превышают десяти.
Выходные данные: Вывести исходную матрицу NN на MM, в которой столбцы с минимальной и максимальной суммой элементов поменяны местами. Числа разделять пробелами. Если присутствует несколько столбцов с одинаковой минимальной суммой элементов, то использовать первый по порядку. Аналогично с максимальной суммой.
Sample Input:
3 4
1 2 3 4
1 3 4 5
0 2 3 -2
Sample Output:
3 2 1 4
4 3 1 5
3 2 0 -2
Мой код:
#include <stdio.h>
int main() {
int N, M, count = 0, max = -9999, min = 9999, jmin, jmax;
scanf("%d%d", &N, &M);
int arr[N][M];
int k = 0;
for(int i = 0; i < N; i++) {
for(int j = 0; j < M; j++) {
scanf("%d ", &arr[i][j]);
}
}
for(int i = 0; i < M; i++) {
for(int j = 0; j < N; j++) {
if (i == k) {
count = count + arr[j][i];
}
if (max <= count) {
max = count;
jmax = j;
}
if (min >= count) {
min = count;
jmin = j;
}
}
printf("%d ", count);
count = 0;
k++;
}
printf("\n%d ", max);
printf("%d \n", min);
for(int i = 0; i < N; i++) {
for(int j = 0; j < M; j++) {
if (j == jmax) {
printf("%d ", arr[i][j]);
}
else if (j == jmin) {
printf("%d ", arr[i][j]);
}
else {
printf("%d ", arr[i][j]);
}
}
printf("\n");
}
return 0;
}
Буду крайне благодарен услышать ваши советы и помощь!
Ответы (1 шт):
Ну, я немного причесал ваш код, посмотрите...
#include <stdio.h>
#include <stdlib.h>
int main()
{
int N, M;
scanf("%d%d", &N, &M);
// Мой VC++ VLA не поддерживает...
int ** arr = malloc(N*sizeof(int*));
for(int i = 0; i < N; ++i)
arr[i] = malloc(M*sizeof(int));
for(int i = 0; i < N; i++)
{
for(int j = 0; j < M; j++)
scanf("%d", &arr[i][j]);
}
// Первоначальные минимум и максимум берем для первого столбца,
// а не какие-то 9999 и -9999...
int idxMin = 0, idxMax = 0, min = 0, max = 0;
for(int i = 0; i < N; i++)
min += arr[i][0];
max = min;
for(int i = 1; i < M; i++)
{
int sum = 0;
for(int j = 0; j < N; j++) sum += arr[j][i];
if (max < sum)
{
max = sum;
idxMax = i;
}
if (min > sum)
{
min = sum;
idxMin = i;
}
}
// printf("\n%d %d\n", max, min); Это не требуется
for(int i = 0; i < N; ++i)
{
int tmp = arr[i][idxMin];
arr[i][idxMin] = arr[i][idxMax];
arr[i][idxMax] = tmp;
}
for(int i = 0; i < N; i++)
{
for(int j = 0; j < M; j++)
printf("%d ", arr[i][j]);
printf("\n");
}
}