반응형

https://www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터

www.acmicpc.net

 

 

[ 문제풀이 ]

 

1. 왼쪽과 오른쪽에 있는 톱니바퀴의 극성이 다른지 체크 후 다르다면 재귀 함수를 이용하여 해당 톱니바퀴로 이동하고, 방문 여부를 저장해 한번 움직인 톱니바퀴는 움직이지 않도록 합니다.

 

2. 재귀함수가 끝나면 해당 톱니바퀴를 해당 방향으로 움직여줍니다.

 

3. 마지막에 12시 방향이 S극이라면 해당 톱니바퀴마다 점수를 더해 출력해줍니다.

 

[ 소스코드 ]

 

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
#include<iostream>
#include<string>
#include<cmath>
 
using namespace std;
 
string arr[5];
int K;
 
void move(int num, int dir)    //톱니바퀴 이동
{
    if (dir == 1) {
        char temp = arr[num][7];
        for (int i = 7; i > 0; i--) {
            arr[num][i] = arr[num][i - 1];
        }
        arr[num][0= temp;
    }
    else {
        char temp = arr[num][0];
        for (int i = 0; i < 7; i++) {
            arr[num][i] = arr[num][i + 1];
        }
        arr[num][7= temp;
    }
}
 
void check(int num, int dir, int visited[5])    //움직일지 말지 정하기
{
    visited[num] = 1;
    if (num == 1) {
        if (arr[num][2!= arr[num + 1][6]) {
            if (visited[2!= 1) {
                check(2, dir * -1, visited);
            }
        }
    }
    else if (num == 2) {
        if (arr[num][2!= arr[num + 1][6]) {
            if (visited[3!= 1) {
                check(3, dir * -1, visited);
            }
        }
        if (arr[num][6!= arr[num - 1][2]) {
            if (visited[1!= 1) {
                check(1, dir * -1, visited);
            }
        }
    }
    else if (num == 3) {
        if (arr[num][2!= arr[num + 1][6]) {
            if (visited[4!= 1) {
                check(4, dir * -1, visited);
            }
        }
        if (arr[num][6!= arr[num - 1][2]) {
            if (visited[2!= 1) {
                check(2, dir * -1, visited);
            }
        }
    }
    else {
        if (arr[num][6!= arr[num - 1][2]) {
            if (visited[3!= 1) {
                check(3, dir * -1, visited);
            }
        }
    }
 
    move(num, dir);
}
 
int main()
{
    for (int i = 1; i <= 4; i++) {
        cin >> arr[i];
    }
    scanf("%d"&K);
 
    for (int i = 0; i < K; i++) {
        int num, dir;
        int visited[5= { 0 };
 
        scanf("%d %d"&num, &dir);
 
        check(num, dir, visited);
    }
 
    int ans = 0;
 
    for (int i = 1; i <= 4; i++) {
        if (arr[i][0== '1') {
            ans += pow(2, i - 1);
        }
    }
 
    printf("%d", ans);
}
cs
반응형

+ Recent posts