special_forces

Untitled

Dec 13th, 2021
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.78 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.     unsigned int flag = 0;
  38.     std::vector < std::vector <char> > codes;
  39.     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 };
  40.     unsigned int rank = 0;
  41.     std::vector < std::vector <char> > comb_s; //все комбинации 2^n
  42.     std::vector <bool> bool_comb_s;// флажок, помогающий понять использован код или нет из 2 ^ n
  43. public:
  44.     class DP_CODE(unsigned int n, unsigned int t) {
  45.         this->n = n;
  46.         this->t = t;
  47.         this->rank = arr_rang[n - 1][t - 1];
  48.         std::cout << this->rank << " НАЧАЛО \n";
  49.     }
  50.  
  51.     unsigned int H_comparison(std::vector <char> arr_comb1, std::vector <char> arr_comb2) { //функция сравнивает коды по условию
  52.         int t1 = 0;
  53.         unsigned int count = 0;
  54.         for (int i = 0;i < n;i++)
  55.         {
  56.             t1 = abs((arr_comb1[i] - '0') - (arr_comb2[i] - '0'));
  57.             if (t1 > 0) {
  58.                 count++;
  59.             }
  60.         }
  61.         return count;
  62.     }
  63.  
  64.     void print2(std::vector <char> arr_comb) {
  65.  
  66.  
  67.         for (int j = 0; j < arr_comb.size(); j++) {
  68.  
  69.             std::cout << arr_comb[j];
  70.         }
  71.         std::cout << "\n";
  72.  
  73.     }
  74.  
  75.     void add_code(std::vector <char> arr_code,int index) {
  76.         codes[index] = arr_code;
  77.        
  78.         for (int i = 0; i < n; i++)
  79.         {
  80.             codes[index][i] = arr_code[i];
  81.  
  82.         }
  83.  
  84.  
  85.  
  86.     }
  87.    
  88.  
  89.     void fillingcodes(int size_codes) {
  90.        
  91.         std::cout << "rank=" << size_codes << "\n";
  92.         if (size_codes == rank) {
  93.            
  94.             for (int i = 0;i < codes.size();i++) {
  95.  
  96.                 print2(codes[i]);
  97.             }
  98.             //добавить флаг,что надо прерывать цикл
  99.             flag = 1;
  100.             return;
  101.         }
  102.         else {
  103.  
  104.             for (int i = 0;i < comb_s.size();i++) {
  105.                 if (flag == 1)
  106.                     break;
  107.                 if (bool_comb_s[i] == 0) {
  108.  
  109.                     if (size_codes == 0) {
  110.                        
  111.                         add_code(comb_s[i], size_codes);//добавить элемент
  112.                         bool_comb_s[i] = 1;
  113.                        
  114.                         fillingcodes(size_codes + 1);
  115.                         if (flag == 0)
  116.                             bool_comb_s[i] = 0;
  117.                        
  118.                     }
  119.                     else
  120.                     {
  121.                         int index = 0;
  122.                         int count = 0;
  123.                         for (int j = 0;j < size_codes; j++) { //сравниаем с теми ,которые уже есть в std::vector < std::vector <char> > codes;
  124.                             if (H_comparison(comb_s[i], codes[j]) <= t) {
  125.                                 count = count + 1;
  126.                                 if (count == 1) {
  127.                                     index = j;
  128.                                 }
  129.                             }  
  130.                             if (count==1) { //дать вомзожность может когда встречается больеш чем надо?
  131.                                 if ((abs(size_codes - index) <= t) && ((size_codes - index) != 0)) {
  132.                                     add_code(comb_s[i], size_codes);
  133.                                     bool_comb_s[i] = 1;
  134.                                     fillingcodes(size_codes + 1);
  135.                                     if (flag == 0)
  136.                                         bool_comb_s[i] = 0;
  137.                             }
  138.                             }
  139.                             if (flag == 1)
  140.                                 break;
  141.                         }
  142.                     }
  143.  
  144.                 }
  145.             }
  146.         }
  147.     }
  148.  
  149.     void creating_codes() {
  150.         if (n < 6 && t < 6) {
  151.  
  152.             int count_comb_s = pow(2, n);
  153.             bool_comb_s.resize(count_comb_s);
  154.             std::vector <char> arr_comb(n); //вспомогательный массив ,нужен только в permutation
  155.             permutation(n, arr_comb, comb_s); //перебор всех комбинаций
  156.             codes.resize(rank);
  157.             fillingcodes(0);
  158.  
  159.         }
  160.         else {
  161.             codes =composition(n, t);
  162.         }
  163.     }
  164.     std::vector <char> merge(std::vector <char> code_1, std::vector <char> code_2) {
  165.         std::vector <char> code_3;
  166.         code_3.resize(code_1.size() + code_2.size());//возможно ошибка
  167.             for (int i = 0; i < code_1.size(); i++)
  168.             {
  169.                 code_3[i] = code_1[i];
  170.             }
  171.             int j = 0;
  172.             for (int i = code_1.size(); i < code_3.size(); i++)
  173.             {  
  174.                 code_3[i] = code_2[j];
  175.                 j++;
  176.             }
  177.             return code_3;
  178.     }
  179.     void  printf_file(std::string a) {
  180.         std::string c = a + ".txt";
  181.         std::ofstream fout(c, std::ofstream::app);
  182.         if (!fout.is_open()) {
  183.             std::cout << "Error";
  184.             return;
  185.         }
  186.         else {
  187.             std::cout << "All okey\n";
  188.         for (int i = 0; i < codes.size(); i++) {
  189.             for (int j = 0; j < n; j++) {
  190.                 std::cout<< codes[i][j]<<" ";
  191.                 fout << codes[i][j];
  192.             }
  193.             fout << "\n";
  194.             std::cout <<  "\n";
  195.         }
  196.         }
  197.         fout.close(); // закрываем файл
  198.  
  199.     }
  200.  
  201.     void  read_file(std::string a, std::vector < std::vector <char> > & codes_1) {
  202.         char ch;
  203.         int i = 0;
  204.         int j = 0;
  205.         std::cout << codes_1.size() <<" ";
  206.         std::string c = a + ".txt";
  207.         std::ifstream fin(c);//чтение данных
  208.         if (!fin.is_open()) {
  209.             std::cout << "Error";
  210.         }
  211.         else {
  212.             std::cout << "All okey\n";
  213.             while (fin.get(ch)) {
  214.                 if (ch == '0'|| ch == '1') {
  215.                     codes_1[i][j] = ch;
  216.                 j++;
  217.                 if (j == codes_1[0].size()) {
  218.                     j = 0;
  219.                     i++;
  220.                 }
  221.                 }
  222.  
  223.             }
  224.         }
  225.         fin.close();
  226.        
  227.     }
  228.    
  229.     std::vector < std::vector <char> >add_limit(std::vector < std::vector <char> > codes_1, std::vector < std::vector <char> > codes_2, unsigned int t_1, unsigned int u_2, unsigned int rank_1) {
  230.         std::vector < std::vector <char> > codes_3;
  231.         codes_3.resize(rank_1);
  232.         unsigned int rank_t=1;
  233.         unsigned int i = 1;
  234.         unsigned int g = 0;
  235.         unsigned int j = 0;
  236.         while (rank_t<=rank_1) //пока не набрали нужное количество по рангу
  237.         {
  238.             while (g < i * t_1) { //от 0 до i*t_1-1,по идее верно
  239.                 if (rank_t == rank_1) {
  240.                     break;
  241.                 }
  242.                 codes_3[rank_t-1]=merge(codes_1[g], codes_2[j]);
  243.                 g++;
  244.                 rank_t++;
  245.  
  246.             }
  247.             g++;
  248.             while (j < i * u_2) {
  249.                 if (rank_t == rank_1) {
  250.                     break;
  251.                 }
  252.                 codes_3[rank_t - 1]=merge(codes_1[g], codes_2[j]);
  253.                 j++;
  254.                 rank_t++;
  255.             }
  256.             j++;
  257.             i++;
  258.             if (rank_t == rank_1) {
  259.                 break;
  260.             }
  261.  
  262.         }
  263.         return codes_3;
  264.     }
  265.     std::vector < std::vector <char> > increase_rank(std::vector < std::vector <char> > codes_1, std::vector < std::vector <char> > codes_2, unsigned int t_1, unsigned int u_2, unsigned int rank_1) {
  266.         std::vector < std::vector <char> > codes_3;
  267.         //нужно учесть длину одного вектора
  268.         codes_3.resize(rank_1);
  269.         unsigned int rank_t = 1;
  270.         unsigned int i = 1;
  271.         unsigned int g = 0;
  272.         int j = 0;
  273.         unsigned int M = codes_2.size(); //всего M элелементов
  274.         while (rank_t <= rank_1) //пока не набрали нужное количество по рангу
  275.         {  
  276.             std::cout << rank_t<<"\n";
  277.             while (j <M) {
  278.                 if (rank_t == rank_1) {
  279.                     break;
  280.                 }
  281.                 codes_3[rank_t - 1] = merge(codes_1[g], codes_2[j]);
  282.                 j++;
  283.                 rank_t++;
  284.                 //M_1++;
  285.  
  286.             }
  287.             g++;
  288.             j--;
  289.             //2)
  290.             while (g < i * t_1 +i) {
  291.                 if (rank_t == rank_1) {
  292.                     break;
  293.                 }
  294.                 codes_3[rank_t - 1] = merge(codes_1[g], codes_2[j]);
  295.                 g++;
  296.                 rank_t++;
  297.             }
  298.             g++;
  299.             //3)
  300.             while (j>=0) { //ошибка
  301.                 if (rank_t == rank_1) {
  302.                     break;
  303.                 }
  304.                 codes_3[rank_t - 1] = merge(codes_1[g], codes_2[j]);
  305.                 j--;
  306.                 rank_t++;
  307.             }
  308.             j = 0; //чтобы убрать -1
  309.             g++;
  310.             i++;
  311.             //4)
  312.             while (g < i * t_1 + i) {
  313.                 if (rank_t == rank_1) {
  314.                     break;
  315.                 }
  316.                 codes_3[rank_t - 1] = merge(codes_1[g], codes_2[j]);
  317.                 g++;
  318.                 rank_t++;
  319.             }
  320.             g++;
  321.             i++;
  322.             if (rank_t == rank_1) {
  323.                 break;
  324.             }
  325.         }
  326.        
  327.         return codes_3;
  328.  
  329.     }
  330.  
  331.     std::vector < std::vector <char> > composition(unsigned int n_1, unsigned int t_1) {
  332.         unsigned int n_2 = 0, t_2 = 0, m = 0, u = 0;
  333.         int mode=0;
  334.         std::vector < std::vector <char> > codes_1;
  335.         std::vector < std::vector <char> > codes_2;
  336.         unsigned int rank_1=0;
  337.         if (n_1 == 1 && t_1 > 6) {
  338.             // обращаемся к файлу нужному
  339.             codes_1.resize(2);
  340.             for (int i = 0; i < 2; i++)
  341.  
  342.             {
  343.                 codes_1[i].resize(1);
  344.             }
  345.             read_file("11", codes_1);
  346.             return codes_1;
  347.         }
  348.  
  349.         if (n_1 < 6 && t_1 < 6) { //добавить условие для 1 и любыъ t
  350.            // обращаемся к файлу нужному
  351.             codes_1.resize(arr_rang[n_1 - 1][t_1 - 1]);
  352.             for (int i = 0; i < arr_rang[n_1 - 1][t_1 - 1]; i++)
  353.  
  354.             {
  355.                 codes_1[i].resize(n_1);
  356.             }
  357.             std::string a = std::to_string(n_1);
  358.             std::string b = std::to_string(t_1);
  359.             read_file(a+b, codes_1);
  360.             return codes_1;
  361.         }
  362.         mode = 0;
  363.         n_2 = n_1 / 2;
  364.         t_2 = t_1 / 2;
  365.         m = n_1 / 2 + n_1 % 2;
  366.         u = t_1 / 2 + t_1 % 2;
  367.         if (t_1 > 5) { //возможно надо доработать условие
  368.             mode = 0;
  369.             n_2 = n_1 / 2;
  370.             t_2 = t_1 / 2;
  371.             m = n_1 / 2 + n_1 % 2;
  372.             u = t_1 / 2 + t_1 % 2;
  373.         }
  374.         else {
  375.             if (n_1 > 5) {
  376.                 mode = 1;
  377.  
  378.                 n_2 = n_1 / 2;
  379.                 t_2 = t_1;
  380.                 m = n_1 / 2 + n_1 % 2;
  381.                 u = t_1;
  382.             }
  383.  
  384.         }
  385.        
  386.    
  387.         codes_1=composition(n_2,t_2); //левая часть
  388.         codes_2=composition(m,u); //правая часть
  389.         unsigned int N = codes_1.size(); //количество кодов
  390.         unsigned int M = codes_2.size(); //количество кодов
  391.         if (mode == 0) {
  392.             if (((M - 1) / u) >= ((N - 1) / t_2))
  393.                 rank_1 = N + ((N - 1) / t_2) * u;
  394.             else
  395.                 rank_1 = M+t_2+ ((M - 1) / u)*t_2;
  396.             return add_limit(codes_1, codes_2, t_2, u, rank_1);
  397.         }
  398.         else
  399.         {  
  400.             rank_1 = M * (N / (t_2 + 1)) + t_2 * (N / (t_2 + 1));
  401.             return  increase_rank(codes_1, codes_2, t_2, u, rank_1);
  402.         }
  403.        
  404.        
  405.  
  406.     }
  407.  
  408. };
Advertisement
Add Comment
Please, Sign In to add comment