Advertisement
Guest User

Untitled

a guest
Feb 21st, 2020
328
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.67 KB | None | 0 0
  1. bool CheckPermutation(vector<int>&& arr2, vector <Pair>&& pairs, int L, int trhld) {
  2.     vector<vector<int>> mat {
  3.                 { 0},
  4.                 { 0, 1},
  5.                 { 0, 2},
  6.                 { 0, 1, 2, 3},
  7.                 { 0, 4},
  8.                 { 0, 1, 4, 5},
  9.                 { 0, 2, 4, 6},
  10.                 { 0, 1, 2, 3, 4, 5, 6, 7}};
  11.     vector <vector<int>> dims(trhld);
  12.     vector <int> arr;
  13.     for (int i = 0; i < L; i++) {
  14.         arr.push_back(pairs[arr2[i]].x);
  15.         arr.push_back(pairs[arr2[i]].y);
  16.     }
  17.     //cout << "tr " << trhld << endl;
  18.     for (int i = 0; i < trhld; i++) {
  19.         dims[i].push_back(i);
  20.     }
  21.    
  22.     //PrintMat(dims);
  23.     for (int i = 0; i < L*2; i+=2) {
  24.         if (arr[i] != arr[i + 1]) {
  25.             for (int j = 0; j < dims[arr[i]].size(); j++) {
  26.                 dims[arr[i + 1]].push_back(dims[arr[i]][j]);
  27.                 //PrintMat(dims);
  28.             }
  29.         }
  30.     }
  31.     for (int i = 0; i < trhld; i++) {
  32.         sort(dims[i].begin(), dims[i].end());
  33.         //dims[i].erase(unique(dims[i].begin(), dims[i].end()), dims[i].end());
  34.         int z = 0;
  35.         int count = 0;
  36.         //vector<int>counts;
  37.         for (int j = 0; j < trhld; j++) {
  38.             count = std::count(dims[i].begin(), dims[i].end(), j);
  39.             //counts.push_back(count);
  40.             if (count % 2 == 0) {
  41.                 dims[i].erase(std::remove(dims[i].begin(), dims[i].end(), j), dims[i].end());
  42.             }
  43.         }
  44.         dims[i].erase(unique(dims[i].begin(), dims[i].end()), dims[i].end());
  45.     }
  46.     //PrintMat(dims);
  47.     if (dims == mat) {
  48.         cout << "!\n";
  49.         PrintMat(dims);
  50.         //cout << "i want pizza\n";
  51.  
  52.         return true;
  53.     }
  54.     return false;
  55. }
  56.  
  57.  
  58.  
  59. void PrintAdd(vector <int> arr, int L, int trhld, vector <Pair> pairs, int lim, int threadTrhld)
  60. {
  61.     unsigned long long max = pow(trhld, L);
  62.     int lastElementNumber = L - 1;
  63.     int c,counter, found = 0;
  64.     unsigned long long i = 0;
  65.     counter = 0;
  66.     cout << max << " " << L << endl;
  67.     while(1) {
  68.         counter++;
  69.         //for (int i = 0; i < max; i++) {
  70.         arr[lastElementNumber]++;
  71.         for (int j = lastElementNumber; j > 0; j--) {
  72.             if (arr[j] == arr[j - 1]) {
  73.                 arr[j]++;
  74.             }
  75.             if (arr[j] >= trhld) {
  76.                 arr[j] = 0;
  77.                 arr[j - 1]++;
  78.                 //counter--;
  79.             }
  80.         }
  81.         //CheckPermutation(arr, L, trhld);
  82.         if (arr[0] == threadTrhld) {
  83.             break;
  84.         }
  85.  
  86.         const int n = trhld;
  87.         bool foundDup = false;
  88.         vector <int> count(n, 0);
  89.  
  90.         for (int i = 0; i < L; i++)
  91.         {
  92.             count[arr[i]]++;
  93.             if (count[arr[i]] > 1) {
  94.                 foundDup = true;
  95.             }
  96.         }
  97.         if (!foundDup) {
  98.             if (counter %  10000 == 0) {
  99.                 PrintVector(arr, L);
  100.                 cout << endl;
  101.             }
  102.             if (CheckPermutation(move(arr), move(pairs), L, lim)) {
  103.                 //PrintArr(arr, L);
  104.                 PrintVector(arr, L);
  105.                 PrintPairs(pairs, arr, L);
  106.                 found++;
  107.                 cout << "found\n";
  108.                 c = getchar();
  109.             }
  110.         }
  111.     }
  112.     cout << "Total: " << found << endl;
  113. }
  114.  
  115.  
  116.  
  117.  
  118. int main()
  119. {
  120.  
  121.     const int L = 7; // L = 8
  122.     //cout << len << endl;
  123.     int c;
  124.  
  125.     vector <vector< int>> permutationMat(6);
  126.     int lim = 8; // thld = 4
  127.    
  128.     for (int i = 0; i < L; i++) {
  129.         permutationMat[0].push_back(i);
  130.     }
  131.  
  132.     vector <Pair> pairsVector;
  133.  
  134.     pairsVector = GetPairs(lim);
  135.     int trhld = pairsVector.size();
  136.     for (int i = 1; i < 6; i++) {
  137.         permutationMat[i] = permutationMat[i-1];
  138.         permutationMat[i][0] += trhld / 6;
  139.     }
  140.     PrintMat(permutationMat);
  141.     //-------------------------------------------------
  142.     unsigned num_cpus = std::thread::hardware_concurrency();
  143.     std::cout << "Launching " << num_cpus << " threads\n";
  144.     std::vector <std::thread> threads(num_cpus);
  145.     c = getchar();
  146.  
  147.     for (unsigned i = 0; i < num_cpus; ++i) {
  148.         threads[i] = thread(PrintAdd, ref(permutationMat[i]), L, trhld, ref(pairsVector),lim, permutationMat[i][0] + trhld / 6);
  149.     }
  150.     for (unsigned i = 0; i < num_cpus; ++i) {
  151.         threads[i].join();
  152.     }
  153.     //FindPermutations(pairsVector, permutationV, L);
  154.     //PrintAdd(permutation, L, trhld, pairsVector, lim);
  155.     cout << "END!\n";
  156.     c = getchar();
  157. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement