fork download
  1. /*
  2. X = {1,2,3}
  3. S = 231213
  4. X = {1,2,3,4}
  5. S = 23421314
  6.  
  7. 최대한 왼쪽에 새로운 숫자를 넣는 방법을 선택
  8. X의 크기는 8이하
  9. X의 원소는 F이하
  10. 불가능한 경우도 있음 dfs탐색?
  11.  */
  12. #include <algorithm>
  13. #include <iostream>
  14. #include <vector>
  15. using namespace std;
  16. int arr[33], N, T;
  17. void print(int *list) {
  18. for (int i = 1; i <= 2 * N; i++) {
  19. cout << list[i] << ' ';
  20. }
  21. cout << '\n';
  22. }
  23. bool dfs(vector<int> availables) {
  24. // ex. N=4
  25. // __4____4
  26. if (availables.empty()) {
  27. for (int i = 1; i <= N; i++) {
  28. if (arr[i] == -1) {
  29. return false;
  30. }
  31. }
  32. return true;
  33. }
  34. int n = availables.at(availables.size() - 1);
  35. for (int i = 2 * N; i - n - 1 > 0; i--) {
  36. if (arr[i] == -1 && arr[i - n - 1] == -1) {
  37. arr[i] = arr[i - n - 1] = n;
  38. availables.pop_back();
  39. if (dfs(availables)) {
  40. return true;
  41. }
  42. availables.emplace_back(n);
  43. arr[i] = arr[i - n - 1] = -1;
  44. }
  45. }
  46.  
  47. return false;
  48. }
  49.  
  50. int main() {
  51. cin >> N;
  52. for (int i = 1; i <= 2 * N; i++) {
  53. arr[i] = -1;
  54. }
  55. vector<int> X;
  56. for (int i = 0; i < N; i++) {
  57. cin >> T;
  58. X.emplace_back(T);
  59. }
  60. sort(X.begin(), X.end());
  61.  
  62. int n = X.at(X.size() - 1);
  63. arr[2*N-n-1] = arr[2 * N] = n;
  64. X.pop_back();
  65. if (dfs(X)) {
  66. print(arr);
  67. return 0;
  68. }
  69. cout << -1;
  70. }
  71.  
Success #stdin #stdout 0.01s 5304KB
stdin
7
1 2 3 4 5 6 7 
stdout
1 4 1 5 6 7 4 2 3 5 2 6 3 7