Компилировать компилятором, который знаком со стандартной библиотекой шаблоновне по наслышке (Visual C++ 6.0 и выше, Borland C++ Builder, ...)
Код | #include <iostream> #include <iterator> #include <algorithm> #include <numeric> #include <vector> #include <stdexcept>
template <typename T, const size_t N> static void show_permutes(const T (&arr_p)[N]) { // число элементов должно быть чётным if (N & 1) throw std::runtime_error("Нечётное количество элементов в массиве");
// делаем копию массива T arr[N]; std::copy(arr_p, arr_p+N, arr);
// Индекс "половинного элемента" const size_t half = N / 2; // Итератор для вывода на консоль std::ostream_iterator<T> output(std::cout, " "); // Ищем среди всех возможных перестановок... while(std::next_permutation(arr, arr+N)) { // ... только те, у которых равны суммы левой и правой половинок if (std::accumulate(arr, arr+half, T()) == std::accumulate(arr+half, arr+N, T())) { // И выводим их на консоль std::copy(arr, arr+N, output); std::cout << std::endl; } } }
int main() { int arr[] = {1,2,3,4}; show_permutes(arr); return (0); } |
Результат:
Код | 1 4 2 3 1 4 3 2 2 3 1 4 2 3 4 1 3 2 1 4 3 2 4 1 4 1 2 3 4 1 3 2 |
|