#include #include #include namespace { enum Dominoes : char { Dot = '.', L = 'L', R = 'R', }; class Solution { public: std::string pushDominoes(std::string dominoes) { bool has_actions = true; while (has_actions) { size_t processed_dot = -1; size_t actions_found = 0; for (size_t i = 0; i < dominoes.size(); ++i) { char d = dominoes[i]; if ((d == L || d == R) && processed_dot != i) { ++actions_found; bool left_dot = false; bool right_dot = false; if (i > 0 && (dominoes[i - 1] == Dot && processed_dot != (i - 1))) left_dot = true; if (i < (dominoes.size() - 1) && dominoes[i + 1] == Dot) right_dot = true; if (d == L && left_dot) { if (i > 1 && dominoes[i - 2] == R && processed_dot != (i - 2)) --actions_found; else { dominoes[i - 1] = L; processed_dot = (i - 1); } } else if (d == R && right_dot) { if (i < (dominoes.size() - 2) && dominoes[i + 2] == L) --actions_found; else { dominoes[i + 1] = R; processed_dot = (i + 1); } } else --actions_found; } } if (!actions_found) has_actions = false; std::cout << "step " << dominoes << '\n'; } return dominoes; } }; } #include TEST(P838_1, 1) { std::string input = ".L.R...LR..L.."; Solution s; auto result = s.pushDominoes(input); EXPECT_EQ(result, std::string("LL.RR.LLRRLL..")); }