#include <cstdio>
#include <vector>
#include <queue>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <set>
#include <deque>
#include <numeric>
#define ll long long
using namespace std;
int K;
vector<pair<int,int>> v;
deque<int> cycle[4];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
for(int i=0;i<4;i++)
{
string s;
cin >> s;
for(auto a : s)
cycle[i].push_back(a-'0');
}
cin >> K;
for(int i=0;i<K;i++)
{
int a, b;
cin >> a >> b;
v.push_back({a-1,b});
}
for(int i=0;i<v.size();i++)
{
int ch = v[i].first;
int dir = v[i].second;
int ch_left = cycle[ch][6];
int ch_right = cycle[ch][2];
if(dir == -1){
int tmp = cycle[ch].front();
cycle[ch].pop_front();
cycle[ch].push_back(tmp);
}else{
int tmp = cycle[ch].back();
cycle[ch].pop_back();
cycle[ch].push_front(tmp);
}
int cur_dir = dir*(-1);
for(int a=ch-1;a>=0;a--)
{
if(cycle[a][2] == ch_left){
break;
}else{
ch_left = cycle[a][6];
if(cur_dir == -1){
int tmp = cycle[a].front();
cycle[a].pop_front();
cycle[a].push_back(tmp);
}else{
int tmp = cycle[a].back();
cycle[a].pop_back();
cycle[a].push_front(tmp);
}
cur_dir *= -1;
}
}
cur_dir = dir*(-1);
for(int b=ch+1;b<4;b++)
{
if(cycle[b][6] == ch_right){
break;
}else{
ch_right = cycle[b][2];
if(cur_dir == -1){
int tmp = cycle[b].front();
cycle[b].pop_front();
cycle[b].push_back(tmp);
}else{
int tmp = cycle[b].back();
cycle[b].pop_back();
cycle[b].push_front(tmp);
}
cur_dir *= -1;
}
}
}
int ans = cycle[0][0]*1 + cycle[1][0]*2 + cycle[2][0]*4 + cycle[3][0]*8;
cout << ans;
return 0;
}
- 핵심
: 회전하기 전 상태
에서 톱니
의 left
, right
를 저장
해서 갱신
해줘야 함
(코드
에서는 순차적으로 처리
하지만, 실제
로는 동시
에 일어나는 일
이기 때문)