fork(2) download
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4.  
  5. bool increase(const std::string& s, std::vector<std::size_t>& it)
  6. {
  7. for (std::size_t i = 0, size = it.size(); i != size; ++i) {
  8. const std::size_t index = size - 1 - i;
  9. ++it[index];
  10. if (it[index] >= s.size()) {
  11. it[index] = 0;
  12. } else {
  13. return true;
  14. }
  15. }
  16. return false;
  17. }
  18.  
  19. void do_job(const std::string& s,
  20. const std::vector<std::size_t>& it)
  21. {
  22. for (std::size_t i = 0; i != it.size(); ++i) {
  23. std::cout << s[it[i]] << " ";
  24. }
  25. std::cout << std::endl;
  26. }
  27.  
  28. void cartesian_product(const std::string& s, std::size_t n)
  29. {
  30. std::vector<std::size_t> it(n, 0u);
  31.  
  32. do {
  33. do_job(s, it);
  34. } while (increase(s, it));
  35. }
  36.  
  37. int main()
  38. {
  39. cartesian_product("abcde", 3);
  40. }
  41.  
Success #stdin #stdout 0s 3460KB
stdin
Standard input is empty
stdout
a a a 
a a b 
a a c 
a a d 
a a e 
a b a 
a b b 
a b c 
a b d 
a b e 
a c a 
a c b 
a c c 
a c d 
a c e 
a d a 
a d b 
a d c 
a d d 
a d e 
a e a 
a e b 
a e c 
a e d 
a e e 
b a a 
b a b 
b a c 
b a d 
b a e 
b b a 
b b b 
b b c 
b b d 
b b e 
b c a 
b c b 
b c c 
b c d 
b c e 
b d a 
b d b 
b d c 
b d d 
b d e 
b e a 
b e b 
b e c 
b e d 
b e e 
c a a 
c a b 
c a c 
c a d 
c a e 
c b a 
c b b 
c b c 
c b d 
c b e 
c c a 
c c b 
c c c 
c c d 
c c e 
c d a 
c d b 
c d c 
c d d 
c d e 
c e a 
c e b 
c e c 
c e d 
c e e 
d a a 
d a b 
d a c 
d a d 
d a e 
d b a 
d b b 
d b c 
d b d 
d b e 
d c a 
d c b 
d c c 
d c d 
d c e 
d d a 
d d b 
d d c 
d d d 
d d e 
d e a 
d e b 
d e c 
d e d 
d e e 
e a a 
e a b 
e a c 
e a d 
e a e 
e b a 
e b b 
e b c 
e b d 
e b e 
e c a 
e c b 
e c c 
e c d 
e c e 
e d a 
e d b 
e d c 
e d d 
e d e 
e e a 
e e b 
e e c 
e e d 
e e e