본문 바로가기
Programming/Algorithm

swe 4013 특이한 자석

by OKOK 2018. 4. 14.

- 톱니바퀴 배열

- 회전 체크 함수

- 회전 시키는 함수

- 답 도출하기


- flag 초기화하기. 



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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/*
1025 특이한 자석 문제풀이 시작
1. 톱니바퀴 배열
2. 회전 체크 함수
3. 회전 시키기.
4. 답 도출하기
-flag 초기화 시키기. 체크하고 턴할때마다.
*/
 
#include <iostream>
#include <algorithm>
using namespace std;
 
int map[5][8];
int flag[5];
int ans;
int K;
struct point{
    int num, dir;
};
point command[21];
 
void problemIn() {
    cin >> K;
 
    for (int i = 1; i < 5; i++) {
        for (int j = 0; j < 8; j++) {
            cin >> map[i][j];
        }
    }
    for (int i = 0; i < K; i++) {
        cin >> command[i].num >> command[i].dir;
    }
}
 
void init() {
    ans = 0;
}
 
void turn_check(int num, int dir) {
    if (num == 1) {
        flag[1= dir;
        if (map[1][2!= map[2][6]) {
            flag[2= -dir;
            if (map[2][2!= map[3][6]) {
                flag[3= dir;
                if (map[3][2!= map[4][6]) {
                    flag[4= -dir;
                }
            }
        }
    }
    else if (num == 2) {
        flag[2= dir;
        if (map[2][6!= map[1][2]) {
            flag[1= -dir;
        }
        if (map[2][2!= map[3][6]) {
            flag[3= -dir;
            if (map[3][2!= map[4][6]) {
                flag[4= dir;
            }
        }
    }
    else if (num == 3) {
        flag[3= dir;
        if (map[3][2!= map[4][6]) {
            flag[4= -dir;
        }
        if (map[3][6!= map[2][2]) {
            flag[2= -dir;
            if (map[2][6!= map[1][2]) {
                flag[1= dir;
            }
        }
    }
    else if (num == 4) {
        flag[4= dir;
        if (map[4][6!= map[3][2]) {
            flag[3= -dir;
            if (map[3][6!= map[2][2]) {
                flag[2= dir;
                if (map[2][6!= map[1][2]) {
                    flag[1= -dir;
                }
            }
        }
    }
}
 
void turn_map() {
    // 맵 인덱스 1, 플래그 인덱스 1, 회전 인덱스 1개
    for (int i = 1; i < 5; i++) {
        if (flag[i] == 1) {
            int tmp = map[i][7];
            for (int k = 6; k >= 0; k--) {
                swap(map[i][k], map[i][k + 1]);
            }
            map[i][0= tmp;
        }
        else if (flag[i] == -1) {
            int tmp = map[i][0];
            for (int k = 1; k <= 7; k++) {
                swap(map[i][k], map[i][k - 1]);
            }
            map[i][7= tmp;
        }
    }
}
 
void solve() {
 
    for (int i = 0; i < K; i++) {
        for (int j = 1; j < 5; j++) flag[j] = 0;
        turn_check(command[i].num, command[i].dir);
        turn_map();
    }
 
    ans += (map[1][0== 1) ? 1 : 0;
    ans += (map[2][0== 1) ? 2 : 0;
    ans += (map[3][0== 1) ? 4 : 0;
    ans += (map[4][0== 1) ? 8 : 0;
}
 
int main() {
    int T;
    cin >> T;
    for (int tc = 1; tc <= T; tc++) {
        problemIn();
        solve();
        cout << "#" << tc << " " << ans << endl;
        init();
    }
    return 0;
}
cs