Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma once
- #include <iostream>
- #include <vector>
- #include <cmath>
- #include <string>
- #include <fstream> // работа с файлами
- #include <iomanip>
- void permutation(int n, std::vector<char>& arr_comb, std::vector < std::vector <char> >& 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 <char> > 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 <char> arr_comb1, std::vector <char> 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 <char> 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 <char> > comb_s; //все комбинации 2^n
- std::vector <bool> bool_comb_s;// флажок, помогающий понять использован код или нет из 2 ^ n
- int count_comb_s = pow(2, n);
- bool_comb_s.resize(count_comb_s);
- std::vector <char> 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 <char> > 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";
- }
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment