본문 바로가기
IT/BOJ

백준(BOJ) 14891 톱니바퀴 *

by 빨강자몽 2019. 3. 25.

# 브루트 포스


리얼 시뮬레이션의 최고봉..


어렵지는 않으나 구현이 뽁잡하다..


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <math.h>
#include <limits.h>
#include <string.h>
#include <string>
#include <sstream>
#define MAX 105
#define INF 2123456789
 
using namespace std;
typedef long long ll;
typedef pair<int,int> pi;
 
int n,a,b,d[2]={1,-1};
char str[MAX];
deque<int> dq[5];
 
void rotate(int num,int r)
// 1 시계방향, -1 반시계방향
{
    if(r==1) {
        dq[num].push_front(dq[num].back());
        dq[num].pop_back();
    } else if(r==-1){
        dq[num].push_back(dq[num].front());
        dq[num].pop_front();
    }
}
 
 
int main(){
    for(int i=1;i<=4;i++)
    {
        scanf("%s",str);
        for(int j=0;j<8;j++)
            dq[i].push_back(str[j]-'0');
    }
 
    scanf("%d",&n);
    for(int i=0;i<n;i++) {
        scanf("%d%d"&a, &b);
 
        int tf[5]={0,};
        queue<pi> q;
 
        tf[a]=b;
        q.push({a,b});
 
        while (!q.empty())
        {
            pi cur=q.front();
            q.pop();
 
            // 왼쪽 톱니 바퀴와 비교
            int na=cur.first-1;
            if(1<=na&&tf[na]==0)
            {
                if(cur.second==3||dq[cur.first].at(6)==dq[na].at(2)) {
                    tf[na]=3;
                    q.push({na, 3});
                }
                else if(dq[cur.first].at(6)!=dq[na].at(2)) {
                    tf[na]=-1 * cur.second;
                    q.push({na, -1 * cur.second});
                }
            }
 
            // 오른쪽 톱니 바퀴와 비교
            na=cur.first+1;
            if(na<=4&&tf[na]==0)
            {
                if(cur.second==3||dq[cur.first].at(2)==dq[na].at(6)){
                    tf[na]=3;
                    q.push({na, 3});
                    continue;
                }
                else if(dq[cur.first].at(2)!=dq[na].at(6)) {
                    tf[na]=-1 * cur.second;
                    q.push({na, -1 * cur.second});
                }
            }
        }
        // 회전 시킨다.
        for(int i=1;i<=4;i++)
            rotate(i,tf[i]);
    }
 
    // 정답 출력
    int num=1,ans=0;
    for(int i=1;i<=4;i++) {
        if (dq[i].front()==1)
            ans+=num;
        num*=2;
    }
    printf("%d",ans);
 
    return 0;
}
 
 
cs


'IT > BOJ' 카테고리의 다른 글

백준(BOJ) 15684 사다리 조작 **  (0) 2019.03.28
백준(BOJ) 15683 감시 *  (0) 2019.03.26
백준(BOJ) 14890 경사로 **  (0) 2019.03.22
백준(BOJ) 14889 스타트와 링크 *  (0) 2019.03.22
백준(BOJ) 14888 연산자 끼워넣기 *  (0) 2019.03.21