1 분 소요

[백준 14891]톱니바퀴

문제 링크

#include "header.h"
using namespace std;
int k;
vector <pair<int, int>> order; //톱니바퀴 번호, 방향
int gear[4][8];
int temp_gear[4][8];

void input(){
    for(int i=0; i<4; i++){
        for(int j=0; j<8; j++){
            scanf("%1d", &gear[i][j]);
        }
    }

    cin >> k;
    for(int i=0; i<k; i++){       
        int x, y;
        cin >> x;
        cin >> y;
        order.push_back({x-1, y});
    }
}
void counter_clockwise(int i){
    temp_gear[i][7] = gear[i][0];
    for(int j=7; j>=1; j--){
        temp_gear[i][j-1] = gear[i][j];
    }
}
void clockwise(int i){
    temp_gear[i][0] = gear[i][7];
    for(int j=0; j<7; j++){
        temp_gear[i][j+1] = gear[i][j];
    }
}
void copy(){
    for(int i=0; i<4; i++){
        for(int j=0; j<8; j++){
            gear[i][j] = temp_gear[i][j];
        }
    }
}
void pre_work(int idx, int flag){
    for(int i=idx-1; i>=0; i--){
            if(gear[i+1][6] == gear[i][2]){
                break; //같으면 더이상 돌아가지 않는다.
            }else{
                //다르면 돌리기
                if(flag == 1){ // 이전에 시계 방향으로 돌렸으면
                    //반시계 방향으로 돌아간다.
                    counter_clockwise(i);
                    flag = -1;
                }else{
                    //시계 방향
                    clockwise(i);
                    flag = 1;
                }
            }
        }
}
void post_work(int idx, int flag){
    for(int i=idx+1; i<4; i++){
            if(gear[i-1][2] == gear[i][6]){
                break;
            }else{
                if(flag == 1){
                    counter_clockwise(i);
                    flag = -1;
                }else{
                    clockwise(i);
                    flag = 1;
                }
            }
        }

}
void turn_gear(pair <int, int>& turn){
    int idx = turn.first; // 톱니바퀴 번호
    int dir = turn.second; // 방향
    // 첫 번째 정수는 회전시킨 톱니바퀴의 번호, 두 번째 정수는 방향이다.
    int flag = dir;
    if(dir == 1){ //시계 방향

        pre_work(idx, flag); //1번 ~ 돌린 톱니바퀴 - 1
        flag = dir;
        post_work(idx, flag); //돌린 톱니바퀴 + 1 ~ 끝까지
        clockwise(idx); //해당 톱니바퀴 돌리기
        //복사
        copy();

    }else{

        pre_work(idx, flag);
        flag = dir;
        post_work(idx, flag);
        counter_clockwise(idx);

        copy();
    }
    
}
int count_all(){
    int ret = 0;

    gear[0][0] == 0 ? ret += 0 : ret += 1;
    gear[1][0] == 0 ? ret += 0 : ret += 2;
    gear[2][0] == 0 ? ret += 0 : ret += 4;
    gear[3][0] == 0 ? ret += 0 : ret += 8;

    return ret;
}
void solve(){
    memcpy(temp_gear, gear, sizeof(gear));

    for(int i=0; i<k; i++){
        pair<int, int> turn = order[i];
        turn_gear(turn);
    }

    int ans = count_all();
    cout << ans << endl;
}
int main()
{
    // ios_base ::sync_with_stdio(false);
    // cin.tie(NULL);
    // cout.tie(NULL);

    input();
    solve();
    
    return 0;
}

카테고리:

업데이트: