全排列
#pragma once
#include <stddef.h>
#include <iostream>
#include <string>
#include <vector>
template <typename T>
std::vector<T> removeElement(std::vector<T> v, size_t index) {
v.erase(std::begin(v) + index);
return v;
}
template <typename T>
void combine(T element, std::vector<std::vector<T>> &arr) {
if (arr.empty()) {arr.push_back(std::vector<T>{element});}
for (auto &i:arr) {
i.insert(i.begin(), element);
}
}
template <typename T>
void print(const std::vector<std::vector<T>> &v) {
std::cout << "List the combination: " << std::endl;
for (const auto &i:v) {
std::cout << "List the element: " << std::endl;
for (const auto &j:i) {
std::cout << j << " ";
}
std::cout << std::endl;
}
std::cout << std::endl;
}
template <typename T>
void combination(std::vector<T> &input, std::vector<std::vector<T>> &output) {
if (input.size() == 1) {
output.push_back(input);
return;
}
for (size_t i = 0; i < input.size(); ++i) {
std::vector<T> removedVec = removeElement(input, i);
std::vector<std::vector<T>> tmpVec;
combination(removedVec, tmpVec);
combine(input[i], tmpVec);
for (const auto &i:tmpVec) {
output.push_back(i);
}
}
}
main.cpp
#include "combination.h"
#include <chrono>
using namespace std;
int main() {
vector<vector<int>> output;
int temp;
vector<int> t;
cout << "Please enter the elements" << endl;
while (cin >> temp) {
t.push_back(temp);
}
auto start = chrono::high_resolution_clock::now();
combination(t, output);
auto end = chrono::high_resolution_clock::now();
chrono::duration<double, milli> time = end - start;
print(output);
cout << "Time consuming: " << time.count() << endl;
}