Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <map>
- #include <windows.h>
- #include <algorithm>
- #include <iomanip>
- using namespace std;
- const int startTime = 0;
- const int endTime = 20;
- vector<vector<int>> combinations;
- vector<vector<int>> good;
- vector<int> combo;
- vector<vector<int>> table = {
- { 0, 4, 4, 0, 0 },
- { 4, 8, 16, 12, 8 }
- };
- vector<int> getFilled(vector<int> lens)
- {
- vector<int> filled(24,0);
- size_t pos = 0;
- for (int i = 0; i < lens.size(); i++)
- {
- while (filled[pos] >= 2)
- {
- if (pos == filled.size())
- {
- pos = 0;
- break;
- }
- else
- pos++;
- }
- if (pos + lens[i] < filled.size())
- for (int j = 0; j < lens[i]; j++)
- filled[pos++]++;
- pos = 0;
- }
- return filled;
- }
- void print(vector<vector<int>> table)
- {
- for (int i = 0; i < table[0].size(); i++)
- {
- for (int j = startTime; j < table[0][i]; j++)
- cout << "-";
- for (int j = table[0][i]; j < table[1][i]; j++)
- cout << "=";
- for (int j = table[1][i]; j < endTime; j++)
- cout << "-";
- cout << endl;
- }
- }
- void f(vector<int> lens)
- {
- do {
- combinations.push_back(lens);
- } while (next_permutation(lens.begin(), lens.end()));
- }
- int main()
- {
- vector<int> lens;
- for (int i = 0; i < table[0].size(); i++)
- lens.push_back(table[1][i] - table[0][i]);
- vector<int> var = getFilled(lens);
- vector<int> temp;
- f(lens);
- cout << "Before: " << endl;
- print(table);
- sort(combinations.begin(), combinations.end(), [](vector<int> first, vector<int> second){
- return first.size() > second.size();
- }
- );
- for (int i = 0; i < combinations.size(); i++)
- {
- bool ifGood = true;
- vector<int> filled = getFilled(combinations[i]);
- for (int j = 0; j < endTime && ifGood ; j++)
- if (filled[j] < 2)
- ifGood = false;
- if (ifGood)
- good.push_back(combinations[i]);
- }
- vector<int> best_combo;
- int min_changes = INT_MAX;
- for (int i = 0; i < good.size(); i++)
- {
- int changes = 0;
- for (int j = 0; j < good[i].size(); j++)
- if (good[i][j] != lens[j])
- changes++;
- if (changes < min_changes)
- min_changes = changes, best_combo = good[i];
- }
- vector<vector<int>> guardsTime(2);
- vector<int> filling(endTime, 0);
- vector<vector<int>> table_copy(table);
- int pos = 0;
- while (!table[0].empty())
- {
- for (int j = 0; j < best_combo.size(); j++)
- {
- for (int i = 0; i < table[0].size(); i++)
- {
- if (table[1][i] - table[0][i] == best_combo[j])
- {
- while (filling[pos] >= 2)
- {
- if (pos == filling.size())
- {
- pos = 0;
- break;
- }
- else
- pos++;
- }
- guardsTime[0].push_back(pos);
- guardsTime[1].push_back(pos + table[1][i] - table[0][i]);
- for (int j = 0; j < table[1][i] - table[0][i]; j++)
- filling[pos++]++;
- pos = 0;
- table[0].erase(table[0].begin() + i);
- table[1].erase(table[1].begin() + i);
- best_combo.erase(best_combo.begin() + j);
- j--;
- break;
- }
- }
- }
- }
- cout << endl <<"After: " << endl;
- print(guardsTime);
- cout << endl;
- for (int i = 0; i < table_copy[0].size(); i++)
- {
- if (guardsTime[0][i] != table_copy[0][i] || guardsTime[1][i] != table_copy[1][i])
- {
- for (int j = guardsTime[0].size()- 1; j > 0 ; j--)
- {
- if (guardsTime[1][j] - guardsTime[0][j] == table_copy[1][i] - table_copy[0][i])
- {
- 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;
- break;
- }
- }
- }
- }
- cout << endl << "Amount of swaps is " << min_changes;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement