CS/Algorithm
[BOJ][C++] 15662 톱니바퀴(2)
별토끼.
2019. 2. 25. 13:47
반응형
[BOJ][C++] 15662 톱니바퀴(2)
문제
https://www.acmicpc.net/problem/15662
풀이
톱니가 1번부터 시작하는 것에 실수를 해서 시간이 걸렸습니다ㅠㅠ
회전할 때마다 우선 check_move로 톱니의 극을 확인해주었습니다.
그 후 움직여야 하는 톱니의 번호와 방향을 이용해 톱니를 움직입니다. 미리 입력한 isMove를 통해 true이면 재귀를 통해 양 옆 톱니가 회전 가능하도록 했습니다. 그리고 visited를 통해 이미 회전을 했을 경우는 다시 회전하지 않도록 설정했습니다!
톱니바퀴1이랑 비슷하지만 톱니바퀴 갯수만 달라졌네요!
코드
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <vector>
using namespace std;
int gear[1001][9];
bool isMove[1001];
bool visited[1001];
int T, K;
void reset() {
for (int i = 1; i <= T; i++) {
visited[i] = false;
}
for (int i = 1; i <= T-1; i++) {
isMove[i] = false;
}
}
void check_move() {
for (int i = 1; i <= T-1; i++) {
if (gear[i][3] != gear[i + 1][7]) {
isMove[i] = true;
}
}
}
void move_left(int num) {
int tmp = gear[num][1];
for (int i = 1; i < 8; i++) {
gear[num][i] = gear[num][i + 1];
}
gear[num][8] = tmp;
}
void move_right(int num) {
int tmp = gear[num][8];
for (int i = 8; i >= 2; i--) {
gear[num][i] = gear[num][i - 1];
}
gear[num][1] = tmp;
}
void move_gear(int num, int dir) {
int next = 1;
visited[num] = true;
if (dir == 1) {
move_right(num);
next = -1;
}
else
move_left(num);
if (isMove[num-1] && !visited[num-1] && num-1 >= 1) { //왼쪽
move_gear(num - 1, next);
}
if (isMove[num] && !visited[num+1] && num+1 <= T) { //오른쪽
move_gear(num + 1, next);
}
}
int main() {
scanf("%d", &T);
for (int i = 1; i <= T; i++) {
for (int j = 1; j <= 8; j++) {
int tmp;
scanf("%1d", &tmp);
gear[i][j] = tmp;
}
}
scanf("%d", &K);
for (int i = 0; i < K; i++) {
int num, dir;
scanf("%d %d", &num, &dir);
//m_gear.push_back(make_pair(num, dir)); //p번 q방향
reset();
check_move();
move_gear(num, dir);
}
int res = 0;
for (int i = 1; i <= T; i++) {
res+=gear[i][1];
}
printf("%d", res);
}
반응형