Advertisement
Sanlover

Untitled

Mar 31st, 2021
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.62 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <map>
  4. #include <windows.h>
  5. #include <algorithm>
  6. #include <iomanip>
  7. using namespace std;
  8.  
  9. const int startTime = 0;
  10. const int endTime = 20;
  11.  
  12. vector<vector<int>> combinations;
  13. vector<vector<int>> good;
  14. vector<int> combo;
  15.  
  16. vector<vector<int>> table = {
  17.     { 0,  4,  4,  0,  0 },
  18.     { 4,  8, 16, 12,  8 }
  19. };
  20. vector<int> getFilled(vector<int> lens)
  21. {
  22.     vector<int> filled(24,0);
  23.  
  24.     size_t pos = 0;
  25.     for (int i = 0; i < lens.size(); i++)
  26.     {
  27.         while (filled[pos] >= 2)
  28.         {
  29.             if (pos == filled.size())
  30.             {
  31.                 pos = 0;
  32.                 break;
  33.             }
  34.             else
  35.                 pos++;
  36.         }
  37.         if (pos + lens[i] < filled.size())
  38.             for (int j = 0; j < lens[i]; j++)
  39.                 filled[pos++]++;
  40.         pos = 0;
  41.     }
  42.     return filled;
  43. }
  44.  
  45. void print(vector<vector<int>> table)
  46. {
  47.     for (int i = 0; i < table[0].size(); i++)
  48.     {
  49.         for (int j = startTime; j < table[0][i]; j++)
  50.             cout << "-";
  51.         for (int j = table[0][i]; j < table[1][i]; j++)
  52.             cout << "=";
  53.         for (int j = table[1][i]; j < endTime; j++)
  54.             cout << "-";
  55.         cout << endl;
  56.     }
  57. }
  58.  
  59. void f(vector<int> lens)
  60. {
  61.     do {
  62.         combinations.push_back(lens);
  63.     } while (next_permutation(lens.begin(), lens.end()));
  64. }
  65.  
  66. int main()
  67. {
  68.     vector<int> lens;
  69.     for (int i = 0; i < table[0].size(); i++)
  70.         lens.push_back(table[1][i] - table[0][i]);
  71.  
  72.     vector<int> var = getFilled(lens);
  73.     vector<int> temp;
  74.     f(lens);
  75.     cout << "Before: " << endl;
  76.     print(table);
  77.     sort(combinations.begin(), combinations.end(), [](vector<int> first, vector<int> second){
  78.             return first.size() > second.size();
  79.         }
  80.     );
  81.  
  82.  
  83.     for (int i = 0; i < combinations.size(); i++)
  84.     {
  85.         bool ifGood = true;
  86.         vector<int> filled = getFilled(combinations[i]);
  87.         for (int j = 0; j < endTime && ifGood ; j++)
  88.             if (filled[j] < 2)
  89.                 ifGood = false;
  90.  
  91.         if (ifGood)
  92.             good.push_back(combinations[i]);
  93.     }
  94.     vector<int> best_combo;
  95.     int min_changes = INT_MAX;
  96.     for (int i = 0; i < good.size(); i++)
  97.     {
  98.         int changes = 0;
  99.         for (int j = 0; j < good[i].size(); j++)
  100.             if (good[i][j] != lens[j])
  101.                 changes++;
  102.         if (changes < min_changes)
  103.             min_changes = changes, best_combo = good[i];
  104.     }
  105.  
  106.     vector<vector<int>> guardsTime(2);
  107.     vector<int> filling(endTime, 0);
  108.  
  109.     vector<vector<int>> table_copy(table);
  110.     int pos = 0;
  111.     while (!table[0].empty())
  112.     {
  113.         for (int j = 0; j < best_combo.size(); j++)
  114.         {
  115.             for (int i = 0; i < table[0].size(); i++)
  116.             {
  117.                 if (table[1][i] - table[0][i] == best_combo[j])
  118.                 {
  119.                     while (filling[pos] >= 2)
  120.                     {
  121.                         if (pos == filling.size())
  122.                         {
  123.                             pos = 0;
  124.                             break;
  125.                         }
  126.                         else
  127.                             pos++;
  128.                     }
  129.                     guardsTime[0].push_back(pos);
  130.                     guardsTime[1].push_back(pos + table[1][i] - table[0][i]);
  131.                     for (int j = 0; j < table[1][i] - table[0][i]; j++)
  132.                             filling[pos++]++;
  133.                     pos = 0;
  134.                     table[0].erase(table[0].begin() + i);
  135.                     table[1].erase(table[1].begin() + i);
  136.                     best_combo.erase(best_combo.begin() + j);
  137.                     j--;
  138.                     break;
  139.                 }
  140.             }
  141.         }
  142.     }
  143.     cout << endl <<"After: " << endl;
  144.     print(guardsTime);
  145.     cout << endl;
  146.  
  147.     for (int i = 0; i < table_copy[0].size(); i++)
  148.     {
  149.         if (guardsTime[0][i] != table_copy[0][i] || guardsTime[1][i] != table_copy[1][i])
  150.         {
  151.             for (int j = guardsTime[0].size()- 1; j > 0 ; j--)
  152.             {
  153.                 if (guardsTime[1][j] - guardsTime[0][j] == table_copy[1][i] - table_copy[0][i])
  154.                 {
  155.                         cout << "Gurdiand #" << i+1 << " swapped with #"<< j+1 << " from [" << table_copy[0][i] << ":" << table_copy[1][i]<< "] to ["<< guardsTime[0][j] << ":" << guardsTime[1][j]  << "]" <<endl;
  156.                         break;
  157.                 }
  158.             }
  159.         }
  160.     }
  161.     cout << endl << "Amount of swaps is " << min_changes;
  162.     return 0;
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement