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);


}

 

반응형