#pragma once
#include <iostream>
int lines; // Кол-во линий
int lenght; // Максимальная длина строки
int** matrix; // Собственно двухмерный массив из символов
// Фигния для сейва матрицы
void saveMatrix() {
FILE *output;
fopen_s(&output, "Output.txt", "w"); // появится в папке с .exe файлом
fprintf_s(output, "%d %d\n", lines, lenght);
for (int line = 0; line < lines; line++) {
for (int symbol = 0; symbol < lenght; symbol++) {
fprintf_s(output, "%d ", matrix[line][symbol]);
}
fprintf_s(output, "\n");
}
}
// Загружаем мастрицу
bool loadMatrix() {
FILE *input;
fopen_s(&input, "Input.txt", "r"); // появится в папке с .exe файлом
if (input == NULL) return 0;
fscanf_s(input, "%d %d\n", &lines, &lenght);
matrix = new int*[lines];
for (int line = 0; line < lines; line++) {
matrix[line] = new int[lenght];
for (int symbol = 0; symbol < lenght; symbol++) {
fscanf_s(input, "%d", &matrix[line][symbol]);
}
}
}
// Получание суммы всех четных элементов в строке
int getSum(int line) {
int sum = 0;
for (int symbol = 0; symbol < lenght; symbol++) {
if (symbol % 2) sum += (int)matrix[line][symbol];
}
return sum;
}
void qsort(int left, int right) {
int main = right; // Порядок опорного элемента в векторе
int local_left = left;
int local_right = right;
while (local_left < local_right) {
// сдвигаем левую границу пока элемент [local_right] больше [опорного элемента]
while ((getSum(local_left) >= getSum(main)) && (local_left < local_right))
local_left++;
if (local_right != local_left) {// если границы не сомкнулись
// Если элемент [left] соседний с [main]
// Свопаем их
if (local_left + 1 == main) {
std::swap(matrix[local_left], matrix[main]);
// Иначе перемещаем элемент [right] на место разрешающего
} else {
std::swap(matrix[local_left], matrix[main - 1]);
std::swap(matrix[main - 1], matrix[main]);
main--;
}
// сдвигаем левую границу вправо
local_right--;
}
}
if (local_left != left) qsort(left, main - 1); // Левая часть
if (local_right != right) qsort(main, right); // Правая часть
}
int main() {
loadMatrix();
qsort(0, lines - 1);
saveMatrix();
system("pause");
}
Comments
0 B
|👍
/👎