https://www.acmicpc.net/problem/14891
- 설명을 읽다보면 특별한 알고리즘을 쓰지 않은 구현임을 바로 알 수 있습니다. - 구현
특정 톱니바퀴를 움직일 때, 인접한 톱니바퀴와 맞닿은 톱니의 극이 같다면 이후의 작업은 진행되지 않습니다.
인접한 톱니의 극이 다르다면 다음 톱니바퀴는 기존의 톱니바퀴의 진행방향과 반대되게 진행됩니다.
위 조건들을 인지한 뒤 1번부터 4번 톱니바퀴 중 처음 움직이는 케이스에 따라 다른 톱니바퀴가 어떻게 움직이는지 구현해주면 되는 간단한 문제였습니다.
void normal(int num): num번 톱니바퀴를 시계 방향으로 회전시키는 함수
void abnormal(int num): num번 톱니바퀴를 반시계 방향으로 회전시키는 함수
void query(int num, int dir): 방향이 1로 주어지면 시계 방향으로, -1이 주어지면 반시계 방향으로 회전하도록 하는 함수
void rotate(int num, int dir): num번 톱니바퀴를 dir의 값에 따라 회전합니다. num이 회전한 상황에 따라 1~4번 톱니바퀴의 움직임이 다르므로 조건에 맞게 순서대로 회전하도록 구현한 함수
#include<iostream>
using namespace std;
int k, answer = 0;
int a[5][8];
void input() {
string s;
for (int i = 1; i <= 4; ++i) {
cin >> s;
for (int j = 0; j < (int)s.length(); ++j) {
a[i][j] = s[j] - '0';
}
}
cin >> k;
}
void normal(int num) {
int tmp[8];
for (int i = 0; i < 8; ++i) {
tmp[(i + 1) % 8] = a[num][i];
}
for (int i = 0; i < 8; ++i) {
a[num][i] = tmp[i];
}
}
void abnormal(int num) {
int tmp[8];
for (int i = 0; i < 8; ++i) {
tmp[(i + 7) % 8] = a[num][i];
}
for (int i = 0; i < 8; ++i) {
a[num][i] = tmp[i];
}
}
void query(int num, int dir) {
if (dir == 1) {
normal(num);
}
else {
abnormal(num);
}
}
void rotate(int num, int dir) {
int left = a[num][6], right = a[num][2];
switch (num) {
case 1:
query(1, dir);
if (right == a[2][6]) break;
right = a[2][2];
query(2, -dir);
if (right == a[3][6]) break;
right = a[3][2];
query(3, dir);
if (right == a[4][6]) break;
query(4, -dir);
break;
case 2:
query(2, dir);
if (left != a[1][2]) {
query(1, -dir);
}
if (right == a[3][6]) break;
right = a[3][2];
query(3, -dir);
if (right == a[4][6]) break;
query(4, dir);
break;
case 3:
query(3, dir);
if (right != a[4][6]) {
query(4, -dir);
}
if (left == a[2][2]) break;
left = a[2][6];
query(2, -dir);
if (left == a[1][2]) break;
query(1, dir);
break;
case 4:
query(4, dir);
if (left == a[3][2]) break;
left = a[3][6];
query(3, -dir);
if (left == a[2][2]) break;
left = a[2][6];
query(2, dir);
if (left == a[1][2]) break;
query(1, -dir);
}
}
void solution() {
input();
int num, dir;
for (int i = 0; i < k; ++i) {
cin >> num >> dir;
rotate(num, dir);
}
for (int i = 0; i < 4; ++i) {
if (a[i + 1][0] == 1) {
answer += (1 << i);
}
}
cout << answer;
}
int main() {
cin.tie(0), cout.tie(0);
ios_base::sync_with_stdio(0);
solution();
return 0;
}