Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <ctime>
- #include <iostream>
- #include <stdlib.h>
- #include <cmath>
- using namespace std;
- // массив row указывает, брать ли нам конкретную строку в результирующую
- // матрицу. Если значение row[i] == true, то тогд берём, иначе нет
- bool* row;
- // массив column предназачен для того же, что и row, только для столбцов
- bool* column;
- //функция, которая решает задачу
- //Аргументы :
- //
- // int ** &a - укащатель на матрицу a. Передаём его по ссылке. Это значит, что
- // если мы, что-нибудь изменим в этой матрицы, изменится и в главной части
- // программы
- //
- // int &n - количество строк матрицы
- //
- // int &m - количество столбцов матрицы
- void solve_matrix(int ** &a, int &n, int &m)
- {
- // массив, который хранит для каждой строки целую часть корня из суммы её
- // элементов
- int* result = (int*)malloc(sizeof(int) * n);
- for (int i = 0; i < n; i++) // бежим по всем строкам
- {
- double sum = 0; // сумма текущей строки
- for (int j = 0; j < m; j++)
- sum += a[i][j]; // считай суммы на i-ой строке и j-ом столбце
- result[i] = (int)sqrt(sum); // считаем квадтраный корень и запоминаем его
- }
- // создаём динамически массивы
- row = (bool*)malloc(sizeof(bool) * n);
- column = (bool*)malloc(sizeof(bool) * m);
- // изначально заполняем их true. То есть, предполагаем, что все строки по
- // дефолту мы берем в результирующую матрицу
- for (int i = 0; i < n; i++)
- row[i] = true;
- // тоже самое со столбцами
- for (int i = 0; i < m; i++)
- column[i] = true;
- for (int i = 0; i < n; i++) // ищем похожие строки
- {
- for (int j = i + 1; j < n; j++)
- if (result[i] == result[j]) { // если их значения одинаковые, то говорим, что ни одну из этих срок мы не берем в итоговую матрицу
- row[i] = false;
- row[j] = false;
- }
- }
- // пересоздаём массив result на m элементов. Здесь, опять же, храним целую
- // часть корня из суммы, теперь уже, столбцов
- result = (int*)realloc(result, sizeof(int) * m);
- for (int j = 0; j < m; j++)
- {
- double sum = 0; // текущая сумма столбца
- for (int i = 0; i < n; i++)
- sum += a[i][j]; // считаем сумму
- result[j] = (int)sqrt(sum); // запоминаем целую часть корня
- }
- for (int i = 0; i < m; i++) // ищем одинаковые столбцы
- for (int j = i + 1; j < m; j++)
- if (result[i] == result[j])
- {
- column[i] = false;
- column[j] = false;
- }
- // считаем количество столбцов и строчек результирующей матрицы
- int new_n = 0, new_m = 0;
- for (int i = 0; i < n; i++)
- if (row[i])
- new_n++;
- for (int i = 0; i < m; i++)
- if (column[i])
- new_m++;
- //создаём новую матрицу b
- int ** b = (int**) malloc(sizeof(int*) * new_n);
- // выделяем новую память под каждую строку
- for (int i = 0; i < new_n; i++)
- b[i] = (int*)malloc(sizeof(int) * new_m);
- // текущая позиция строки и столбца, куда нжуно вставить элемент
- // (-1, -1) говорит о том, что мы еще не нашли ни одной строки и сnолбца
- int x = -1, y = -1;
- for (int i = 0; i < n; i++)
- if (row[i]) // если эта строка хорошая, то есть подходит под наши условия
- {
- x++; // увеличиваем позицию строки
- for (int j = 0; j < m; j++) // смотрим по столбцам. Бёрем ли элемент на стыке i-ой строки и j-го столбца
- if (column[j]) // Если да, то запоминаем его в резулт. матрицу
- {
- y++;
- b[x][y] = a[i][j];
- }
- y = -1; // Обнуляем позицию текущего столбца
- }
- a = b; // обновляем нашу матрицу
- n = new_n;
- m = new_m;
- }
- // Функция которая печатает матрицу.
- // Аргументы :
- // verdict : Строка, которая выводится перед матрицей
- // a - указатель на матрицу
- // n - кол-во строк матрицу
- // m - кол-во столбцов матрицы
- //
- void print_matrix(char* verdict, int ** a, int n, int m)
- {
- printf("%s\n", verdict);
- for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < m; j++)
- printf("%d ", a[i][j]);
- printf("\n");
- }
- }
- //
- // главная функция программы
- int main()
- {
- int n, m;
- // делаем что бы функция rand() выдавала случайные числа
- srand(time(NULL));
- printf("Введите размеры матрицы\n");
- //вводятся размеры матрицы
- cin >> n >> m;
- // выделеяем память под матрицу a
- int **a = (int**)malloc(sizeof(int) * n);
- for (int i = 0; i < n; i++)
- a[i] = (int*)malloc(sizeof(int) * m);
- // заполняем матрицу рандомными числами
- for (int i = 0; i < n; i++)
- for (int j = 0; j < m; j++)
- a[i][j] = rand();
- print_matrix((char*)" Random matrix ", a, n, m);
- solve_matrix(a, n, m);
- print_matrix((char*)" Result matrix ", a, n, m);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement