special_forces

Untitled

Dec 6th, 2021
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.87 KB | None | 0 0
  1. #pragma once
  2. #include <iostream>
  3. #include <vector>
  4. #include <cmath>
  5. #include <string>
  6. #include <fstream> // работа с файлами
  7. #include <iomanip>
  8.  
  9. void permutation(int n, std::vector<char>& arr_comb, std::vector < std::vector <char> >& comb_s) { //Размещения с повторением 2^n
  10.  
  11.     if (n < 0) {
  12.         std::cout << "нельзя отрицательные\n";
  13.         return;
  14.  
  15.     }
  16.     if (n == 0)
  17.     {
  18.         for (int i = 0; i <= arr_comb.size() - 1; i++)
  19.             std::cout << arr_comb[i] << " ";
  20.         std::cout << "\n";
  21.         comb_s.push_back(arr_comb);
  22.         return;
  23.     }
  24.     else {
  25.         for (int i = 0;i <= 1;i++) {
  26.             arr_comb[arr_comb.size() - n] = i + '0';
  27.             permutation(n - 1, arr_comb, comb_s);
  28.         }
  29.     }
  30. }
  31.  
  32. class DP_CODE
  33. {
  34. private:
  35.     unsigned int n = 0;
  36.     unsigned int t = 0;
  37.     std::vector < std::vector <char> > codes;
  38.     unsigned int arr_rang[5][5] = { 2,2,2,2,2,3,3,3,3,3,5,4,4,4,4,8,6,5,5,5,14,8,7,6,6 };
  39.     unsigned int rank = 0;
  40. public:
  41.     class DP_CODE(unsigned int n, unsigned int t) {
  42.         this->n = n;
  43.         this->t = t;
  44.         this->rank = arr_rang[n - 1][t - 1];
  45.         std::cout << this->rank << " НАЧАЛО \n";
  46.     }
  47.  
  48.     unsigned int H_comparison(std::vector <char> arr_comb1, std::vector <char> arr_comb2) { //функция сравнивает коды по условию
  49.         int t1 = 0;
  50.         unsigned int count = 0;
  51.         for (int i = 0;i < n;i++)
  52.         {
  53.             t1 = abs((arr_comb1[i] - '0') - (arr_comb2[i] - '0'));
  54.             if (t1 > 0) {
  55.                 count++;
  56.             }
  57.         }
  58.         return count;
  59.     }
  60.  
  61.     void print2(std::vector <char> arr_comb) {
  62.  
  63.  
  64.         for (int j = 0; j < n; j++) {
  65.  
  66.             std::cout << arr_comb[j];
  67.         }
  68.         std::cout << "\n";
  69.  
  70.     }
  71.  
  72.     void creating_codes() {
  73.         if (n < 6 && t < 6) {
  74.  
  75.             std::vector < std::vector <char> > comb_s; //все комбинации 2^n
  76.             std::vector <bool> bool_comb_s; // флажок,помогающий понять использован код или нет из 2^n
  77.             int count_comb_s = pow(2, n);
  78.             bool_comb_s.resize(count_comb_s);
  79.             std::vector <char> arr_comb(n); //вспомогательный массив ,нужен только в permutation
  80.             permutation(n, arr_comb, comb_s); //перебор всех комбинаций
  81.             codes.push_back(comb_s[0]);
  82.             unsigned int value_func_H = 0; //разность кодов
  83.             int count = 0;
  84.             int ind_comb1 = 0; //-- нужны чтобы ставить код между ними,если выполняется условие
  85.             int ind_comb2 = 0; //--
  86.             codes.push_back(comb_s[0]); // -------------------------------------
  87.             int rank_t = 1; // занесли первый код,а именно 0000
  88.             bool_comb_s[0] = 1;//------------------------------------------------------
  89.             int i_comb = 0;//нужен чтобы начать пользоваться  между индексами ,когда переберет после первого раза через  цикл
  90.             while (rank_t < 7) //условие должны быть rank_t < rank в общем пока не будет rank кодов в  std::vector < std::vector <char> > codes;
  91.             {
  92.                 for (int i = 1;i < count_comb_s;i++)  //перебор всех кодов
  93.                 {
  94.  
  95.                     if (bool_comb_s[i] == 0)  //проверяем использован код или нет
  96.                     {
  97.                         for (int j = 0;j < codes.size();j++) //в этом цикле с помощью  H_comparison ищем новые коды,удовлетворяющих условию (добавить)
  98.                         {
  99.  
  100.                             value_func_H = H_comparison(comb_s[i], codes[j]); //условие
  101.                             if (value_func_H <= t) {
  102.                                 count = count + 1;
  103.                                 if (count > 1)
  104.                                 {
  105.                                     ind_comb2 = j; //индекс 2 например  этот 8 ,а первый 7
  106.                                 }
  107.                                 else {
  108.                                     ind_comb1 = j; // индекс 1
  109.                                 }
  110.                             }
  111.                         }
  112.  
  113.                         if (count == 1) {
  114.                             if (ind_comb1 == codes.size() - 1) { //добавляет в конец новый код
  115.                                 codes.push_back(comb_s[i]);
  116.                                 rank_t++;
  117.                                 bool_comb_s[i] = 1;
  118.                             }
  119.                         }
  120.                         if (count == 1 && i_comb > 0) {//добавляет в начало код после первого полного цикла от i до count_comb_s,i_comb помогает это определить
  121.  
  122.                             if (codes.size() != 1)
  123.                             {
  124.                                 if (ind_comb1 == 0)
  125.                                 {
  126.                                     print2(comb_s[i]);
  127.                                     std::cout << "---------------\n";
  128.                                     codes.insert(codes.begin(), comb_s[i]);
  129.                                     std::cout << "insert\n";
  130.                                     rank_t++;
  131.                                     bool_comb_s[i] = 1;
  132.                                 }
  133.                             }
  134.  
  135.                         }
  136.  
  137.                         if (count > 1) {  //если больше 1 ,то значит,возможно,что коды имеют нужную разность.например ,изначально было 0011 1010 ,
  138.                             std::cout << "ТУТ\n"; //но между ними можно вставить какое-нибудь код,если у этого кода выполняется услвоие между ними двумя и причем  (dif <= t && dif != 0)
  139.                             int dif = abs(ind_comb2 - ind_comb1);
  140.                             if (dif <= t && dif != 0) {
  141.                                 {
  142.                                     bool_comb_s[i] = 1;
  143.                                     codes.insert(codes.begin() + ind_comb2, comb_s[i]);
  144.                                     rank_t++;
  145.                                 }
  146.                             }
  147.  
  148.                         }
  149.                     }
  150.                     count = 0;
  151.                 }
  152.                 i_comb++;
  153.             }
  154.  
  155.             std::cout << "rank_t=======" << rank_t << "\n";
  156.             std::cout << "Оставшиеся коды\n";
  157.             for (int i = 0;i < count_comb_s;i++) {
  158.                 if (bool_comb_s[i] == 0) {
  159.                     print2(comb_s[i]);
  160.                 }
  161.  
  162.             }
  163.             std::cout << "Коды,которые вошли в нужный набор\n";
  164.             for (int i = 0;i < count_comb_s;i++) {
  165.                 if (bool_comb_s[i] == 1) {
  166.                     print2(comb_s[i]);
  167.                 }
  168.  
  169.             }
  170.             std::cout << "Вывод набор нужных кодов \n";
  171.             for (int i = 0;i < codes.size();i++) {
  172.                 print2(codes[i]);
  173.             }
  174.             std::cout << "---------------\n";
  175.         }
  176.  
  177.     }
  178.  
  179.  
  180. };
  181.  
Advertisement
Add Comment
Please, Sign In to add comment