Advertisement
Guest User

Untitled

a guest
Oct 18th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.54 KB | None | 0 0
  1. // BMI.cpp : generowanie permutacji poprzez najmniejsza ilosc transpozycji
  2. //
  3.  
  4. // kompilacja: g++ BMI.cpp -o BMI -std=c++11
  5.  
  6. #include "stdafx.h"
  7. #include <iostream>
  8. #include <vector>
  9. #include <cmath>
  10.  
  11. /* BMI zdefiniowane wg algorytmu 8 */
  12. int bmi(int m, int i) {
  13.     if ((m % 2 == 0) && (m > 2))
  14.         if (i < m - 1)
  15.             return i;
  16.         else return m - 2;
  17.     else return m - 1;
  18. }
  19.  
  20. void perm(int m, std::vector<int> &p) {
  21.     // vector pomocniczy
  22.     auto fill_help = [&]() { std::vector<int> res;  for (auto i = 0; i < m; i++) res.push_back(0); return res; };
  23.     auto help = fill_help();
  24.     auto x = 1;
  25.  
  26.     // wypisz 1sza permutacje
  27.     for (auto i = 0; i < p.size(); ++i) {
  28.         std::cout << p[i] << " ";
  29.     }
  30.     std::cout << std::endl;
  31.  
  32.     // generuj reszte permutacji
  33.     while (x < m) {
  34.         if (help[x] < x) {
  35.             auto tmp = p[x];
  36.  
  37.             // test zmodyfikowanej wersji bmi, rowniez generuje permutacje ale w innej kolejnosci
  38.             //auto bmi = x - 2 < 0 ? x - 1 : x - 2;
  39.             /*p[x] = p[bmi];
  40.             p[bmi] = tmp;*/
  41.  
  42.             p[x] = p[bmi(x, help[x])];
  43.             p[bmi(x, help[x])] = tmp;
  44.  
  45.             for (auto i = 0; i < p.size(); ++i) {
  46.                 std::cout << p[i] << " ";
  47.             }
  48.             std::cout << std::endl;
  49.  
  50.             help[x]++;
  51.             x = 1;
  52.         }
  53.         else {
  54.             help[x] = 0;
  55.             x++;
  56.         }
  57.     }
  58. }
  59.  
  60. int main()
  61. {
  62.     // tablica globalna (prawie) nigdy nie jest dobrym pomyslem
  63.     std::vector<int> p;
  64.     int ile;
  65.  
  66.     std::cout << "Ile elementow ma miec zbior?" << std::endl;
  67.     std::cin >> ile;
  68.  
  69.     p.resize(ile);
  70.  
  71.     int n = p.size();
  72.     for (auto i = 1; i <= n; ++i) {
  73.         p[i - 1] = i;
  74.     }
  75.     perm(n, p);
  76.     return 0;
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement