#pragma once #include #include #include #include #include // работа с файлами #include void permutation(int n, std::vector& arr_comb, std::vector < std::vector >& comb_s) { //Размещения с повторением 2^n if (n < 0) { std::cout << "нельзя отрицательные\n"; return; } if (n == 0) { for (int i = 0; i <= arr_comb.size() - 1; i++) std::cout << arr_comb[i] << " "; std::cout << "\n"; comb_s.push_back(arr_comb); return; } else { for (int i = 0;i <= 1;i++) { arr_comb[arr_comb.size() - n] = i + '0'; permutation(n - 1, arr_comb, comb_s); } } } class DP_CODE { private: unsigned int n = 0; unsigned int t = 0; std::vector < std::vector > codes; 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 }; unsigned int rank = 0; public: class DP_CODE(unsigned int n, unsigned int t) { this->n = n; this->t = t; this->rank = arr_rang[n - 1][t - 1]; std::cout << this->rank << " НАЧАЛО \n"; } unsigned int H_comparison(std::vector arr_comb1, std::vector arr_comb2) { //функция сравнивает коды по условию int t1 = 0; unsigned int count = 0; for (int i = 0;i < n;i++) { t1 = abs((arr_comb1[i] - '0') - (arr_comb2[i] - '0')); if (t1 > 0) { count++; } } return count; } void print2(std::vector arr_comb) { for (int j = 0; j < n; j++) { std::cout << arr_comb[j]; } std::cout << "\n"; } void creating_codes() { if (n < 6 && t < 6) { std::vector < std::vector > comb_s; //все комбинации 2^n std::vector bool_comb_s;// флажок, помогающий понять использован код или нет из 2 ^ n int count_comb_s = pow(2, n); bool_comb_s.resize(count_comb_s); std::vector arr_comb(n); //вспомогательный массив ,нужен только в permutation permutation(n, arr_comb, comb_s); //перебор всех комбинаций codes.push_back(comb_s[0]); bool_comb_s[0] = 1; int count_rank = 1; int rank_t = 1; unsigned int value_func_H = 0; //разность кодов int count = 0; int ind_comb1 = 0; //-- нужны чтобы ставить код между ними,если выполняется условие int ind_comb2 = 0; //-- int i_comb = 0; //нужен чтобы начать пользоваться между индексами ,когда переберет после первого раза через цикл while (rank_t < 7) //условие должны быть rank_t < rank в общем пока не будет rank кодов в std::vector < std::vector > codes; { for (int i = 1;i < count_comb_s;i++) //перебор всех кодов { if (bool_comb_s[i] == 0) //проверяем использован код или нет { for (int j = 0;j < codes.size();j++) //в этом цикле с помощью H_comparison ищем новые коды,удовлетворяющих условию (добавить) { value_func_H = H_comparison(comb_s[i], codes[j]); //условие if (value_func_H <= t) { count = count + 1; if (count > 1) { ind_comb2 = j; //индекс 2 например этот 8 ,а первый 7 } else { ind_comb1 = j; // индекс 1 } } } if (count == 1) { if (ind_comb1 == codes.size() - 1) { //добавляет в конец новый код codes.push_back(comb_s[i]); rank_t++; bool_comb_s[i] = 1; } } if (count == 1 && i_comb > 0) {//добавляет в начало код после первого полного цикла от i до count_comb_s,i_comb помогает это определить if (codes.size() != 1) { if (ind_comb1 == 0) { print2(comb_s[i]); std::cout << "---------------\n"; codes.insert(codes.begin(), comb_s[i]); std::cout << "insert\n"; rank_t++; bool_comb_s[i] = 1; } } } if (count > 1) { //если больше 1 ,то значит,возможно,что коды имеют нужную разность.например ,изначально было 0011 1010 , std::cout << "ТУТ\n"; //но между ними можно вставить какое-нибудь код,если у этого кода выполняется услвоие между ними двумя и причем (dif <= t && dif != 0) int dif = abs(ind_comb2 - ind_comb1); if (dif <= t && dif != 0) { { bool_comb_s[i] = 1; codes.insert(codes.begin() + ind_comb2, comb_s[i]); rank_t++; } } } } count = 0; } i_comb++; } std::cout << "rank_t=======" << rank_t << "\n"; std::cout << "Оставшиеся коды\n"; for (int i = 0;i < count_comb_s;i++) { if (bool_comb_s[i] == 0) { print2(comb_s[i]); } } std::cout << "Коды,которые вошли в нужный набор\n"; for (int i = 0;i < count_comb_s;i++) { if (bool_comb_s[i] == 1) { print2(comb_s[i]); } } std::cout << "Вывод набор нужных кодов \n"; for (int i = 0;i < codes.size();i++) { print2(codes[i]); } std::cout << "---------------\n"; } } };