알고리즘/시뮬레이션
[백준]톱니바퀴
안잡아모찌
2019. 7. 19. 20:31
https://www.acmicpc.net/problem/14891
14891번: 톱니바퀴
첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터 시계방향 순서대로 주어진다. N극은 0, S극은 1로 나타나있다. 다섯째 줄에는 회전 횟수 K(1 ≤ K ≤ 100)가 주어진다. 다음 K개 줄에는 회전시킨 방법이 순서대로 주어진다. 각 방법은 두 개의 정수로 이루어져 있고, 첫 번째 정수는 회전시킨 톱니바퀴
www.acmicpc.net
왜 틀렸을까. . ?
연쇄해서 돌리는 것만 잘 생각해주면 되고 , 사실 동시에 일어나는 일이기 때문에 전의 바뀐결과가 앞으로의 영향을
미치면 안되기때문에, 돌리기 전에 미리 연쇄여부를 계산하고 돌려줬다.
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
|
#include <iostream>
#include<vector>
using namespace std;
int Chair[5][8]; //톱니
bool CanR[3]; //1-2 , 2-3 ,3-4 맞닿은 부분, true면 돌리기가능
int N;
void CheckR() {
if (Chair[1][2] != Chair[2][6]) CanR[0] = true;
else CanR[0] = false;
if (Chair[2][2] != Chair[3][6]) CanR[1] = true;
else CanR[1] = false;
if (Chair[3][2] != Chair[4][6]) CanR[2] = true;
else CanR[2] = false;
}
void Rotation(int which, int how) {
if (how == 1) {
//시계방향
int tmp = Chair[which][7];
for (int i = 6; i >= 0; i--) Chair[which][i + 1] = Chair[which][i];
Chair[which][0] = tmp;
}
else if (how == -1) {
//반시계 방향
int tmp = Chair[which][0];
for (int i = 0; i <= 6; i++) Chair[which][i] = Chair[which][i + 1];
Chair[which][7] = tmp;
}
}
void solve(int Which, int how) {
Rotation(Which, how);
if (Which == 1) {
if (CanR[0] == true) {
Rotation(2, how*(-1));
if (CanR[1] == true) {
Rotation(3, how);
if (CanR[2] == true) {
Rotation(4, how*(-1));
}
}
}
}
else if (Which == 2) {
if (CanR[0] == true) Rotation(1, how*(-1));
if (CanR[1] == true) {
Rotation(3, how*(-1));
if (CanR[2] == true) Rotation(4, how);
}
}
else if (Which == 3) {
if (CanR[2] == true) Rotation(4, how*(-1));
if (CanR[1] == true) {
Rotation(2, how*(-1));
if (CanR[0] == true) Rotation(1, how);
}
}
else if (Which == 4) {
if (CanR[2] == true) {
Rotation(3, how*(-1));
if (CanR[1] == true) {
Rotation(2, how);
if (CanR[0] = true) Rotation(1, how*(-1));
}
}
}
}
int main()
{
for (int i = 1; i <= 4; i++) for(int j=0;j<8;j++) scanf_s("%1d",&Chair[i][j]);
cin >> N;
for (int i = 0; i < N; i++) {
//N번 실행
int Which, how;
cin >> Which >> how;
CheckR(); //돌릴수있는곳 체크
solve(Which, how); //한번 돌림
}
int sum = 0;
if (Chair[1][0] == 1) sum += 1;
if (Chair[2][0] == 1) sum += 2;
if (Chair[3][0] == 1) sum += 4;
if (Chair[4][0] == 1) sum += 8;
printf("%d\n", sum);
return 0;
}
|
cs |