Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Tags
more
Archives
Today
Total
관리 메뉴

대웅짱님의 블로그

[14891] 톱니바퀴 본문

알고리즘/BOJ

[14891] 톱니바퀴

대웅짱 2019. 2. 24. 21:40

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



4개의 톱니바퀴와 각 톱니바퀴의 8 개의 볼록 부분의 상태가 주어진다.


그 후 쿼리가 최대 100번 까지 들어오면서


톱니바퀴의 번호와 회전 방향이 주어졌을 때


쿼리를 모두 수행한 후 톱니바퀴의 상태를 묻는 문제이다.


문제의 주제는 시뮬레이션이다.


각 쿼리 수행 후 톱니바퀴의 상태를 틀리지 않고 잘 가지고 갈 수 있으면 어렵지 않다.


문제 해결 아이디어는


쿼리가 들어왔을 때


먼저 해당 번호의 톱니바퀴를 방향에 맞게 회전 한다.


그 후 해당 번호부터 오른쪽의 톱니바퀴를 전부 회전 시켜주고


끝나면 나머지 왼쪽의 톱니바퀴를 회전하면 된다.


톱니바퀴를 회전할 때 만약 극이 같아 회전하지 않았다면


그 쪽 방향은 더 이상 진행하지 않아도 된다.


회전하지 않은 톱니바퀴가 있으면 그 이후의 톱니바퀴도 회전하지 않기 때문이다.


회전 방향은 입력받은 회전 방향부터


한 톱니바퀴마다 반대 방향으로 회전시켜주면 된다.


예를 들어 1번 톱니바퀴를 시계방향 회전이 입력이었을 때


모든 톱니바퀴의 맞닿는 부분이 반대 극이여서 전부 회전해야 한다면


1 - 시계, 2 - 반 시계, 3 - 시계, 4 - 반 시계 방향으로 회전하면 된다.


그리고 톱니바퀴의 상태가 붙어서 입력되는데


만약 한 숫자씩 입력받고 싶다면


1
2
3
4
5
for(int i=0; i<4; i++){
        for(int j=0; j<8; j++){
            scanf("%1d"&gear[i][j]);
        }
    }
cs


이런식으로  scanf 안에 "%1d"를 입력하면 한 숫자씩 받아올 수 있다.


문자열의 경우도 마찬가지로 "%1c"를 입력하면 한 글자씩 받아온다.


나중에 입력 때문에 골치아픈 경우도 있으니 알아두면 써둘 곳이 있을 것이다.


끝.






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
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int gear[4][8], rotation[4], temp[8];
int function(int n, int d){
    memcpy(temp, gear[n], sizeof(gear[n]));
    if(d==1){
        for(int i=1; i<8; i++){
            gear[n][i] = temp[i-1];
        }
        gear[n][0= temp[7];
    }else{
        for(int i=1; i<8; i++){
            gear[n][i-1= temp[i];
        }
        gear[n][7= temp[0];
    }
}
int main(){
    for(int i=0; i<4; i++){
        for(int j=0; j<8; j++){
            scanf("%1d"&gear[i][j]);
        }
    }
    int k;
    scanf("%d"&k);
    for(int i=0; i<k; i++){
        int n, d, td;
        scanf("%d %d"&n, &d);
        n--;
        memset(rotation, 0sizeof(rotation));
        if(gear[0][2!= gear[1][6]) rotation[1]=1;
        if(gear[1][2!= gear[2][6]) rotation[2]=1;
        if(gear[2][2!= gear[3][6]) rotation[3]=1;
 
        //나
        function(n, d);
        td = d;
        //오른쪽
        for(int i=n+1; i<4; i++){
            if(!rotation[i]) break;
            td *= -1;
            function(i, td);
        }
        //왼쪽
        td = d;
        for(int i=n-1; i>=0; i--){
            if(!rotation[i+1]) break;
            td *= -1;
            function(i, td);
        }
    }
    int res, t;
    res = 0; t = 1;
    for(int i=0; i<4; i++){
        res += (gear[i][0* t);
        t <<= 1;
    }
    printf("%d\n", res);
 
 
    return 0;
}
cs




'알고리즘 > BOJ' 카테고리의 다른 글

[15683] 감시  (0) 2019.03.06
[2473] 세 용액  (0) 2019.03.05
[14890] 경사로  (0) 2019.02.19
[14889] 스타트와 링크  (0) 2019.02.19
[14888] 연산자 끼워넣기  (0) 2019.02.19