한 톱니바퀴가 회전하게 되면 인접한 톱니바퀴부터 회전할지 안 할지 결정해야 하므로 큐를 사용하여 나타내었다. 회전 조건 수 만큼 반복문을 돌면서 회전을 해주게 되는데 rotation
이 회전을 해주는 함수이다. 함수를 보면 조건에 따라 큐에 추가해주는데 이때 인접한 톱니바퀴가 회전을 한다면 방향은 현재 톱니바퀴의 반대 방향으로 무조건 회전하므로 -1을 곱해주어 추가하였다. 회전은 문자열 앞 뒤에 추가해주는 방식으로 해주었다.
간단한 구현 문제였다.
#include <iostream>
#include <vector>
#include <queue>
#include <cmath>
#include <cstring>
using namespace std;
string s[4];
bool check[4];
vector<pair<int, int>> v;
int dn[2] = { -1,1 };
int K, res = 0;
void rotation(int a, int b) {
queue<pair<int, int>> q;
q.push({ a, b });
check[a] = true;
while (!q.empty()) {
int n = q.front().first;
int dir = q.front().second;
q.pop();
for (int i = 0; i < 2; i++) {
int nn = n + dn[i];
if (nn < 0 || nn>3) continue;
if (check[nn]) continue;
if (i == 0) {
if (s[n][6] == s[nn][2]) {
q.push({ nn, 0 });
}
else {
q.push({ nn,dir * -1 });
}
}
else {
if (s[n][2] == s[nn][6]) {
q.push({ nn,0 });
}
else {
q.push({ nn,dir * -1 });
}
}
check[nn] = true;
}
if (dir == 1) {
char tmp = s[n][s[n].size() - 1];
s[n].pop_back();
s[n] = tmp + s[n];
}
else if (dir == -1) {
char tmp = s[n][0];
s[n].erase(s[n].begin());
s[n] = s[n] + tmp;
}
}
}
void solution() {
for (int i = 0; i < K; i++) {
memset(check, 0, sizeof(check));
int n = v[i].first;
int dir = v[i].second;
rotation(n, dir);
}
for (int i = 0; i < 4; i++) {
if (s[i][0] == '1') res += pow(2, i);
}
cout << res;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
for (int i = 0; i < 4; i++) {
cin >> s[i];
}
cin >> K;
for (int i = 0; i < K; i++) {
int a, b;
cin >> a >> b;
v.push_back({ a - 1,b });
}
solution();
return 0;
}