fork download
  1. // Jarod42
  2.  
  3. #include <algorithm>
  4. #include <cassert>
  5. #include <iostream>
  6. #include <iterator>
  7. #include <vector>
  8.  
  9. bool increase(std::vector<bool>& bs)
  10. {
  11. for (std::size_t i = 0; i != bs.size(); ++i) {
  12. bs[i] = !bs[i];
  13. if (bs[i] == true) {
  14. return true;
  15. }
  16. }
  17. return false; // overflow
  18. }
  19.  
  20. template <typename T, typename F>
  21. void PowerSet(const std::vector<T>& v, F f)
  22. {
  23. std::vector<bool> bitset(v.size());
  24.  
  25. do {
  26. f(v, bitset);
  27. } while (increase(bitset));
  28. }
  29.  
  30. template <typename T, typename F>
  31. void AllArrangements(const std::vector<T>& v, F f)
  32. {
  33. PowerSet(v, [f](const std::vector<T>& v, const std::vector<bool>& bitset){
  34. std::vector<T> toPermute;
  35. for (std::size_t i = 0; i != v.size(); ++i) {
  36. if (bitset[i]) {
  37. toPermute.push_back(v[i]);
  38. }
  39. }
  40. do {
  41. f(toPermute);
  42. } while (std::next_permutation(toPermute.begin(), toPermute.end()));
  43. });
  44. }
  45.  
  46.  
  47. int main()
  48. {
  49. std::vector<char> vc{ 'A', 'B', 'C', 'D' };
  50. std::sort(vc.begin(), vc.end());
  51. std::cout << "\n------All Arrangements-------------\n";
  52. AllArrangements(vc,
  53. [](const auto& v){
  54. for (const auto& e : v) {
  55. std::cout << e << " "; }
  56. std::cout << std::endl;
  57. });
  58. }
  59.  
Success #stdin #stdout 0s 15240KB
stdin
Standard input is empty
stdout
------All Arrangements-------------

A 
B 
A B 
B A 
C 
A C 
C A 
B C 
C B 
A B C 
A C B 
B A C 
B C A 
C A B 
C B A 
D 
A D 
D A 
B D 
D B 
A B D 
A D B 
B A D 
B D A 
D A B 
D B A 
C D 
D C 
A C D 
A D C 
C A D 
C D A 
D A C 
D C A 
B C D 
B D C 
C B D 
C D B 
D B C 
D C B 
A B C D 
A B D C 
A C B D 
A C D B 
A D B C 
A D C B 
B A C D 
B A D C 
B C A D 
B C D A 
B D A C 
B D C A 
C A B D 
C A D B 
C B A D 
C B D A 
C D A B 
C D B A 
D A B C 
D A C B 
D B A C 
D B C A 
D C A B 
D C B A