#include <algorithm>
#include <cassert>
#include <deque>
#include <iostream>
#include <limits>
#include <utility>
#include <vector>
template <typename Collection>
void printCollection(const Collection& collection)
{
for (int i = 0; i < collection.size(); i++) {
std::cout << collection[i];
if (i < collection.size() - 1) {
std::cout << " ";
}
}
std::cout << "\n";
}
class Platform
{
public:
// ID notation: <1;100>; 0 means no further platforms
explicit Platform(std::vector<int> v) : _nextPlatforms(std::move(v)) {}
// ID notation: <0;99> -1 means no further platforms
int getNextPlatform()
{
if (_nextPlatforms.empty()) {
return -1;
}
const int id = _nextId++;
if (_nextId >= _nextPlatforms.size()) {
_nextId = 0;
}
return _nextPlatforms[id] - 1;
}
bool isStartState() const { return _nextId == 0; }
private:
std::vector<int> _nextPlatforms{};
int _nextId{0};
};
// rows in range <1;500>
// cols in range <1;500>
// moves string size in range <1;300000>
std::vector<Platform> getInput()
{
int n;
std::cin >> n;
std::vector<Platform> input;
input.reserve(n);
for (int i = 0; i < n; ++i) {
int p;
std::cin >> p;
std::vector<int> vec(p);
for (int j = 0; j < p; ++j) {
std::cin >> vec[j];
}
input.emplace_back(Platform(std::move(vec)));
}
return input;
// return v;
// return {{'.', '.', '.', '.', '.'},
// {'.', 'B', '.', 'C', '.'},
// {'.', '.', 'C', '.', '.'},
// {'.', '.', '.', 'B', '.'}};
}
void print(std::vector<Platform>& platforms)
{
std::cout << platforms.size() << "\n";
for (auto& platform : platforms) {
do {
std::cout << platform.getNextPlatform() + 1 << " ";
} while (!platform.isStartState());
}
}
void travel(std::vector<Platform>& platforms)
{
for (int i = 0; i != -1;) {
i = platforms[i].getNextPlatform();
}
}
int main()
{
// input
auto platforms = getInput();
int count{0};
do {
travel(platforms);
++count;
} while (!std::all_of(platforms.begin(), platforms.end(), [](auto& platform) {
return platform.isStartState();
}));
// output
// printBoard(board);
// print(platforms);
std::cout << count << "\n";
// TESTS
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | #include <algorithm> #include <cassert> #include <deque> #include <iostream> #include <limits> #include <utility> #include <vector> template <typename Collection> void printCollection(const Collection& collection) { for (int i = 0; i < collection.size(); i++) { std::cout << collection[i]; if (i < collection.size() - 1) { std::cout << " "; } } std::cout << "\n"; } class Platform { public: // ID notation: <1;100>; 0 means no further platforms explicit Platform(std::vector<int> v) : _nextPlatforms(std::move(v)) {} // ID notation: <0;99> -1 means no further platforms int getNextPlatform() { if (_nextPlatforms.empty()) { return -1; } const int id = _nextId++; if (_nextId >= _nextPlatforms.size()) { _nextId = 0; } return _nextPlatforms[id] - 1; } bool isStartState() const { return _nextId == 0; } private: std::vector<int> _nextPlatforms{}; int _nextId{0}; }; // rows in range <1;500> // cols in range <1;500> // moves string size in range <1;300000> std::vector<Platform> getInput() { int n; std::cin >> n; std::vector<Platform> input; input.reserve(n); for (int i = 0; i < n; ++i) { int p; std::cin >> p; std::vector<int> vec(p); for (int j = 0; j < p; ++j) { std::cin >> vec[j]; } input.emplace_back(Platform(std::move(vec))); } return input; // return v; // return {{'.', '.', '.', '.', '.'}, // {'.', 'B', '.', 'C', '.'}, // {'.', '.', 'C', '.', '.'}, // {'.', '.', '.', 'B', '.'}}; } void print(std::vector<Platform>& platforms) { std::cout << platforms.size() << "\n"; for (auto& platform : platforms) { do { std::cout << platform.getNextPlatform() + 1 << " "; } while (!platform.isStartState()); } } void travel(std::vector<Platform>& platforms) { for (int i = 0; i != -1;) { i = platforms[i].getNextPlatform(); } } int main() { // input auto platforms = getInput(); int count{0}; do { travel(platforms); ++count; } while (!std::all_of(platforms.begin(), platforms.end(), [](auto& platform) { return platform.isStartState(); })); // output // printBoard(board); // print(platforms); std::cout << count << "\n"; // TESTS } |
English