Study hard
(c++)백준 14891번: 톱니바퀴 본문
14891번: 톱니바퀴
총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴
www.acmicpc.net






[풀이]
문제에 나온 톱니바퀴의 회전 규칙을 구현하는 문제였다.
w[n][i]에 n번 톱니바퀴의 i번째 칸의 극을 저장하였다. 그리고 K번 톱니바퀴 번호와 방향을 받을때마다 톱니바퀴들을 회전시켰다.
2번 톱니바퀴를 회전시킨다고 할 때 w[2][6]과 w[1][2]가 같으면 1번 톱니바퀴도 같이 반대방향으로 회전해야한다. 그리고 w[2][2]와 w[3][6]이 같으면 3번 톱니바퀴도 회전해야한다.
→재귀함수로 구현하였다. 한번 회전한 톱니바퀴를 다시 회전시키면 안되므로 bool turned[]배열을 이용하여 표시해주었다.
※톱니바퀴 상태는 띄어쓰지 않고 주어지기 따문에 scanf를 사용하기!
#include <iostream>
#include <cstring>//memset
#include <cstdio>//scanf
using namespace std;
int K;
int w[5][8];//톱니바퀴
bool turned[5];
void Turn(int n, int d) {
int t = w[n][2];
int s = w[n][6];
turned[n] = true;
//시계방향
if (d == 1) {
int tmp = w[n][7];
for (int i = 6; i >= 0; i--)
w[n][i + 1] = w[n][i];
w[n][0] = tmp;
}
//시계반대방향
else {
int tmp = w[n][0];
for (int i = 1; i <= 7; i++)
w[n][i - 1] = w[n][i];
w[n][7] = tmp;
}
//양쪽 톱니바퀴의 맞닿은 부분이 다른극이면
if (n != 4 && t != w[n + 1][6] && turned[n + 1] == false)
Turn(n + 1, -d);
if (n != 1 && s != w[n - 1][2] && turned[n - 1] == false)
Turn(n - 1, -d);
}
int getScore() {
int res = 0;
if (w[1][0] == 1)
res += 1;
if (w[2][0] == 1)
res += 2;
if (w[3][0] == 1)
res += 4;
if (w[4][0] == 1)
res += 8;
return res;
}
int main() {
for (int i = 1; i <= 4; i++) {
for (int j = 0; j < 8; j++) {
scanf("%1d", &w[i][j]);
}
}
cin >> K;
int n, d;
while (K--) {
cin >> n >> d;
memset(turned, false, sizeof(turned));
Turn(n, d);
}
cout << getScore() << '\n';
return 0;
}
'백준 > 시뮬레이션,구현' 카테고리의 다른 글
(c++)백준 15686번: 치킨 배달 (0) | 2021.04.10 |
---|---|
(c++)백준 15685번: 드래곤 커브 (0) | 2021.04.09 |
(c++)백준 14890번: 경사로 (0) | 2021.04.04 |
(c++)백준 20058번: 마법사 상어와 파이어스톰 (0) | 2021.03.27 |
(c++)백준 20057번: 마법사 상어와 토네이도 (0) | 2021.03.26 |