문제 주소 : www.acmicpc.net/problem/14891
문제 확인
간단한 시뮬레이션 문제입니다. 주어진 상황을 그대로 구현하면 됩니다.
풀이
톱니바퀴의 왼쪽과 오른쪽을 가리키는 인덱스를 저장시켜두고 방향 전환을 하면서 맞춰 기록해갑니다.
톱니바퀴가 회전할 때 서로 맞닿은 극에 따라 옆에있는 톱니바퀴의 회전이 결정됩니다. 회전 시 맞닿은 톱니의 극이 다르다면 옆의 톱니바퀴는 반대방향으로 회전하게 됩니다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#include <cstdio>
#define mod(x,d) x=d!=1?(x+1)%8:(x+7)%8
#define flip(x) x!=1?1:-1
char a[4][9];
int p[4][3] = { {0,2,6},{0,2,6},{0,2,6},{0,2,6} }, n, cur, d, i, l, r;//오웬
int main() {
scanf("%s%s%s%s", a[0], a[1], a[2], a[3]);
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%d%d", &cur, &d); cur--;
for (l = cur - 1; l >= 0 && a[l][p[l][1]] != a[l + 1][p[l + 1][2]]; l--);
for (r = cur + 1; r < 4 && a[r - 1][p[r - 1][1]] != a[r][p[r][2]]; r++);
for (int k = cur, td = d; k > l; k--, td = flip(td)) {
mod(p[k][0], td); mod(p[k][1], td); mod(p[k][2], td);
}
for (int k = cur + 1, td = flip(d); k < r; k++, td = flip(td)) {
mod(p[k][0], td); mod(p[k][1], td); mod(p[k][2], td);
}
}
for (i = 0, n = 0, cur = 1; i < 4; i++, cur <<= 1)
if (a[i][p[i][0]] == '1') n += cur;
printf("%d", n);
}
|
cs |
반응형
'알고리즘 문제 > [백준]' 카테고리의 다른 글
[백준] 13334 철로 (0) | 2021.01.14 |
---|---|
[백준] 9376 탈옥 (0) | 2021.01.12 |
[백준] 1444 숌 언어 (0) | 2021.01.07 |
[백준] 15562 네트워크 (0) | 2021.01.04 |
[백준] 18233 러버덕을 사랑하는 모임 (0) | 2021.01.03 |