Advertisement
Guest User

Misja 18 – pz91

a guest
Feb 25th, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.95 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <omp.h>
  4. #include <cmath>
  5.  
  6. #define THREAD_NUM 8
  7.  
  8.  
  9. int **arr;
  10.  
  11. void initMemory(int k, int th){
  12.     arr = new int*[th];
  13.     omp_set_num_threads(th);
  14.     for(int i = 0; i < th; i++){
  15.         arr[i] = new int[k];
  16.     }
  17. }
  18.  
  19. void freeMemory(int th){
  20.     for(int i = 0; i < th; i++){
  21.         delete[] arr[i];
  22.     }
  23.     delete[] arr;
  24. }
  25.  
  26. int getA(int a, int b, int k){
  27.     for(int i = 0; i < k; i++){
  28.         int lshi = k - i - 1;
  29.         if(a & (1 << lshi)){
  30.             b ^= (lshi > 0) ? (0x07 << (lshi - 1)) : (0x03);
  31.         }
  32.     }
  33.     return b;
  34. }
  35.  
  36. void print(int k, int tn){
  37.     for(int i = 0; i < k; i++){
  38.         for(int j = 0; j < k; j++){
  39.             int lshi = k - j - 1;
  40.             std::cout << (bool)(arr[tn][i] & (1 << lshi));
  41.         }
  42.         std::cout << " ";
  43.     }
  44.     std::cout << std::endl;
  45. }
  46.  
  47. void bruteLoop(int k){
  48.     int range = pow(2, k) - 1;
  49.  
  50.     #pragma omp parallel
  51.     {
  52.         int a;
  53.         int b;
  54.         int th = omp_get_thread_num();
  55.         #pragma omp for schedule(dynamic)
  56.             for(int i = 0; i <= range; i++){
  57.                 arr[th][0] = i;
  58.                 a = getA(arr[th][0], 0, k);
  59.                 b = arr[th][0];
  60.                 for(int j = 1; j < k; j++){
  61.                     arr[th][j] = ~a;
  62.                     a = getA(arr[th][j], b, k);
  63.                     b = arr[th][j];
  64.                 }              
  65.         #pragma omp critical
  66.                 if((a & range) == (-1 & range)){
  67.                     print(k, th);
  68.                 }
  69.                
  70.             }
  71.     }
  72. }
  73.  
  74. int main(int argc, char *argv[])
  75. {
  76.     if(argc < 2){
  77.         return -1;
  78.     }
  79.     else{
  80.         int k = atoi(argv[1]);
  81.         if(k < 1 || k > 24){
  82.             return -2;
  83.         }
  84.         else{
  85.             initMemory(k, THREAD_NUM);    
  86.             bruteLoop(k);
  87.             freeMemory(THREAD_NUM);
  88.         }
  89.     }
  90.    
  91.     return 0;
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement