#include <algorithm>
#include <iostream>
template <typename Iterator>
inline bool next_combination(Iterator first,
Iterator k,
Iterator last);
int main () {
int array[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
do {
do {
std::cout << array[0] << array[1] << array[2] << "\n";
} while(std::next_permutation(array, array+3));
} while(next_combination(array,array+3,array+8));
}
template <typename Iterator>
inline bool next_combination(const Iterator first, Iterator k, const Iterator last)
{
/* Credits: Thomas Draper */
// http://stackoverflow.com/a/5097100/8747
if ((first == last) || (first == k) || (last == k))
return false;
Iterator itr1 = first;
Iterator itr2 = last;
++itr1;
if (last == itr1)
return false;
itr1 = last;
--itr1;
itr1 = k;
--itr2;
while (first != itr1)
{
if (*--itr1 < *itr2)
{
Iterator j = k;
while (!(*itr1 < *j)) ++j;
std::iter_swap(itr1,j);
++itr1;
++j;
itr2 = k;
std::rotate(itr1,j,last);
while (last != j)
{
++j;
++itr2;
}
std::rotate(k,itr2,last);
return true;
}
}
std::rotate(first,k,last);
return false;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXJhdG9yPgppbmxpbmUgYm9vbCBuZXh0X2NvbWJpbmF0aW9uKEl0ZXJhdG9yIGZpcnN0LAogIEl0ZXJhdG9yIGssCiAgSXRlcmF0b3IgbGFzdCk7CgppbnQgbWFpbiAoKSB7CiAgaW50IGFycmF5W10gPSB7IDEsIDIsIDMsIDQsIDUsIDYsIDcsIDggfTsKICBkbyB7CiAgICBkbyB7CiAgICAgICBzdGQ6OmNvdXQgPDwgYXJyYXlbMF0gPDwgYXJyYXlbMV0gPDwgYXJyYXlbMl0gPDwgIlxuIjsKICAgIH0gd2hpbGUoc3RkOjpuZXh0X3Blcm11dGF0aW9uKGFycmF5LCBhcnJheSszKSk7CiAgfSB3aGlsZShuZXh0X2NvbWJpbmF0aW9uKGFycmF5LGFycmF5KzMsYXJyYXkrOCkpOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcmF0b3I+CmlubGluZSBib29sIG5leHRfY29tYmluYXRpb24oY29uc3QgSXRlcmF0b3IgZmlyc3QsIEl0ZXJhdG9yIGssIGNvbnN0IEl0ZXJhdG9yIGxhc3QpCnsKICAgLyogQ3JlZGl0czogVGhvbWFzIERyYXBlciAqLwogICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS81MDk3MTAwLzg3NDcKICAgaWYgKChmaXJzdCA9PSBsYXN0KSB8fCAoZmlyc3QgPT0gaykgfHwgKGxhc3QgPT0gaykpCiAgICAgIHJldHVybiBmYWxzZTsKICAgSXRlcmF0b3IgaXRyMSA9IGZpcnN0OwogICBJdGVyYXRvciBpdHIyID0gbGFzdDsKICAgKytpdHIxOwogICBpZiAobGFzdCA9PSBpdHIxKQogICAgICByZXR1cm4gZmFsc2U7CiAgIGl0cjEgPSBsYXN0OwogICAtLWl0cjE7CiAgIGl0cjEgPSBrOwogICAtLWl0cjI7CiAgIHdoaWxlIChmaXJzdCAhPSBpdHIxKQogICB7CiAgICAgIGlmICgqLS1pdHIxIDwgKml0cjIpCiAgICAgIHsKICAgICAgICAgSXRlcmF0b3IgaiA9IGs7CiAgICAgICAgIHdoaWxlICghKCppdHIxIDwgKmopKSArK2o7CiAgICAgICAgIHN0ZDo6aXRlcl9zd2FwKGl0cjEsaik7CiAgICAgICAgICsraXRyMTsKICAgICAgICAgKytqOwogICAgICAgICBpdHIyID0gazsKICAgICAgICAgc3RkOjpyb3RhdGUoaXRyMSxqLGxhc3QpOwogICAgICAgICB3aGlsZSAobGFzdCAhPSBqKQogICAgICAgICB7CiAgICAgICAgICAgICsrajsKICAgICAgICAgICAgKytpdHIyOwogICAgICAgICB9CiAgICAgICAgIHN0ZDo6cm90YXRlKGssaXRyMixsYXN0KTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgfQogICBzdGQ6OnJvdGF0ZShmaXJzdCxrLGxhc3QpOwogICByZXR1cm4gZmFsc2U7Cn0K