Initial commit
This commit is contained in:
74
838/838-1.cpp
Normal file
74
838/838-1.cpp
Normal file
@@ -0,0 +1,74 @@
|
||||
#include <string>
|
||||
#include <iostream>
|
||||
#include <set>
|
||||
|
||||
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 <gtest/gtest.h>
|
||||
|
||||
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.."));
|
||||
}
|
||||
Reference in New Issue
Block a user