Advertisement
Guest User

Untitled

a guest
Apr 20th, 2014
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.54 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <ctime>
  3. #include <iostream>
  4. #include <stdlib.h>
  5. #include <cmath>
  6.  
  7. using namespace std;
  8.  
  9. // массив row указывает, брать ли нам конкретную строку в результирующую
  10. // матрицу. Если значение row[i] == true, то тогд берём, иначе нет
  11. bool* row;
  12. // массив column предназачен для того же, что и row, только для столбцов
  13. bool* column;
  14.  
  15. //функция, которая решает задачу
  16. //Аргументы :
  17. //
  18. //  int ** &a - укащатель на матрицу a. Передаём его по ссылке. Это значит, что
  19. //  если мы, что-нибудь изменим в этой матрицы, изменится и в главной части
  20. //  программы
  21. //
  22. //  int &n - количество строк матрицы
  23. //
  24. //  int &m - количество столбцов матрицы
  25. void solve_matrix(int ** &a, int &n, int &m)
  26. {
  27.     // массив, который хранит для каждой строки целую часть корня из суммы её
  28.     // элементов
  29.     int* result = (int*)malloc(sizeof(int) * n);
  30.     for (int i = 0; i < n; i++) // бежим по всем строкам
  31.     {
  32.         double sum = 0; // сумма текущей строки
  33.         for (int j = 0; j < m; j++)
  34.             sum += a[i][j]; // считай суммы на i-ой строке и j-ом столбце
  35.         result[i] = (int)sqrt(sum); // считаем квадтраный корень и запоминаем его
  36.     }
  37.     // создаём динамически массивы
  38.     row = (bool*)malloc(sizeof(bool) * n);
  39.     column = (bool*)malloc(sizeof(bool) * m);
  40.    
  41.     // изначально заполняем их true. То есть, предполагаем, что все строки по
  42.     // дефолту мы берем в результирующую матрицу
  43.     for (int i = 0; i < n; i++)
  44.         row[i] = true;
  45.     // тоже самое со столбцами
  46.     for (int i = 0; i < m; i++)
  47.         column[i] = true;
  48.  
  49.     for (int i = 0; i < n; i++) // ищем похожие строки
  50.     {
  51.         for (int j = i + 1; j < n; j++)
  52.           if (result[i] == result[j]) { // если их значения одинаковые, то говорим, что ни одну из этих срок мы не берем в итоговую матрицу
  53.             row[i] = false;
  54.             row[j] = false;
  55.           }
  56.  
  57.     }
  58.    
  59.     // пересоздаём массив result на m элементов. Здесь, опять же, храним целую
  60.     // часть корня из суммы, теперь уже, столбцов
  61.     result = (int*)realloc(result, sizeof(int) * m);
  62.     for (int j = 0; j < m; j++)
  63.     {
  64.         double sum = 0; // текущая сумма столбца
  65.         for (int i = 0; i < n; i++)
  66.             sum += a[i][j]; // считаем сумму
  67.         result[j] = (int)sqrt(sum); // запоминаем целую часть корня
  68.     }
  69.    
  70.     for (int i = 0; i < m; i++) // ищем одинаковые столбцы
  71.         for (int j = i + 1; j < m; j++)
  72.             if (result[i] == result[j])
  73.             {
  74.                 column[i] = false;
  75.                 column[j] = false;
  76.             }
  77.  
  78.     // считаем количество столбцов и строчек результирующей матрицы
  79.     int new_n = 0, new_m = 0;
  80.     for (int i = 0; i < n; i++)
  81.         if (row[i])
  82.             new_n++;
  83.     for (int i = 0; i < m; i++)
  84.         if (column[i])
  85.             new_m++;
  86.  
  87.     //создаём новую матрицу b
  88.     int ** b = (int**) malloc(sizeof(int*) * new_n);
  89.     // выделяем новую память под каждую строку
  90.     for (int i = 0; i < new_n; i++)
  91.         b[i] = (int*)malloc(sizeof(int) * new_m);
  92.     // текущая позиция строки и столбца, куда нжуно вставить элемент
  93.     // (-1, -1) говорит о том, что мы еще не нашли ни одной строки и сnолбца
  94.     int x = -1, y = -1;
  95.     for (int i = 0; i < n; i++)
  96.         if (row[i]) // если эта строка хорошая, то есть подходит под наши условия
  97.         {
  98.             x++; // увеличиваем позицию строки
  99.             for (int j = 0; j < m; j++)  // смотрим по столбцам. Бёрем ли элемент на стыке i-ой строки и j-го столбца
  100.                 if (column[j]) // Если да, то запоминаем его в резулт. матрицу
  101.                 {
  102.                     y++;
  103.                     b[x][y] = a[i][j];
  104.                 }
  105.             y = -1; // Обнуляем позицию текущего столбца
  106.         }
  107.     a = b; // обновляем нашу матрицу
  108.     n = new_n;
  109.     m = new_m;
  110. }
  111.  
  112. // Функция которая печатает матрицу.
  113. // Аргументы :
  114. //      verdict : Строка, которая выводится перед матрицей
  115. //      a - указатель на матрицу
  116. //      n - кол-во строк матрицу
  117. //      m - кол-во столбцов матрицы
  118. //      
  119. void print_matrix(char* verdict, int ** a, int n, int m)
  120. {
  121.     printf("%s\n", verdict);
  122.     for (int i = 0; i < n; i++)
  123.     {
  124.         for (int j = 0; j < m; j++)
  125.             printf("%d ", a[i][j]);
  126.         printf("\n");
  127.     }
  128.  
  129. }
  130.  
  131. //
  132. // главная функция программы
  133. int main()
  134. {
  135.     int n, m;
  136.     // делаем что бы функция rand() выдавала случайные числа
  137.     srand(time(NULL));
  138.     printf("Введите размеры матрицы\n");
  139.     //вводятся размеры матрицы
  140.     cin >> n >> m;
  141.     // выделеяем память под матрицу a
  142.     int **a = (int**)malloc(sizeof(int) * n);
  143.     for (int i = 0; i < n; i++)
  144.         a[i] = (int*)malloc(sizeof(int) * m);
  145.    
  146.     // заполняем матрицу рандомными числами
  147.     for (int i = 0; i < n; i++)
  148.         for (int j = 0; j < m; j++)
  149.             a[i][j] = rand();
  150.    
  151.     print_matrix((char*)" Random matrix ", a, n, m);
  152.     solve_matrix(a, n, m);
  153.     print_matrix((char*)" Result matrix ", a, n, m);
  154.        
  155. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement