function.cpp 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #include <algorithm>
  2. #include <cstdlib>
  3. #include <iostream>
  4. #include <vector>
  5. #include "function.h"
  6. using std::vector; using std::swap; using std::ostream;
  7. // 处理参数
  8. void read_arg(const int argc, char ***pargv, std::vector<int> &arr) {
  9. char **argv = *pargv;
  10. if (argc < 3)
  11. throw std::invalid_argument("usage: ./run.exe [arr_size] [arr (split by space)]");
  12. const size_t arr_size = strtoul(argv[1], NULL, 0);
  13. if (arr_size + 2 != static_cast<size_t>(argc))
  14. throw std::invalid_argument("arr_size dosen't fit");
  15. int carr[arr_size];
  16. for (size_t i = 0; i < arr_size; ++i)
  17. carr[i] = strtol(argv[2 + i], NULL, 0);
  18. arr = vector<int>(&carr[0], &carr[arr_size]);
  19. }
  20. // 检查beg与end之间有无重复值
  21. bool isdiff(vector<int> &arr, size_t beg, size_t end) {
  22. for (size_t i = beg; i < end; ++i) {
  23. if (arr[i] == arr[end])
  24. return false;
  25. }
  26. return true;
  27. }
  28. // 递归求全排列并存入vector<vector<int>>中
  29. void perm_r(vector<int> &arr, size_t pos, size_t len, vector<vector<int>> &res){
  30. if (pos == len) {
  31. res.push_back(arr);
  32. return;
  33. }
  34. for (size_t i = pos; i <= len; ++i) {
  35. if (isdiff(arr, pos, i) == true) {
  36. swap(arr[pos], arr[i]);
  37. perm_r(arr, pos + 1, len, res);
  38. swap(arr[pos], arr[i]);
  39. }
  40. }
  41. }
  42. // 简化入口
  43. void permutation(vector<int> &arr, vector<vector<int>> &res) {
  44. perm_r(arr, 0, arr.size() - 1, res);
  45. }
  46. // 打印vector<int>
  47. ostream &print_arr(const vector<int> &vec, ostream &os) {
  48. os << "[";
  49. for (const int &n : vec)
  50. os << " " << n;
  51. os << " ]";
  52. return os;
  53. };