티스토리 뷰

Algorithm/BOJ

14891 톱니바퀴

henry1214 2018. 4. 9. 18:30

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



K번 톱니바퀴를 회전시킨 후 점수의 합을 구하는 문제이다. 매번 톱니바퀴를 돌리면 서로 맞닿은 극이 다를 경우에만 회전하게 된다. 현재 상태를 기준으로 다음 회전할 방향을 미리 저장한 후 move함수를 이용하여 상태를 변화시킨다.



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
#include <cstdio>
#include <cstring>
 
// w[i][j]: i번째 톱니바퀴의 j번째 점수
// nd[i]: i번째 톱니바퀴의 다음 이동 방향
int w[5][9],nd[5],k,n,d;
 
int sum()
{
    int s=0;
    for(int i=1,j=1;i<=4;i++,j*=2)
        if(w[i][1]) s+=j;
    return s;
}
 
void move()
{
    for(int i=1;i<=4;i++)
    {
        if(nd[i]==1)
        {
            int t=w[i][8];
            for(int j=8;j>=2;j--)
                w[i][j]=w[i][j-1];
            w[i][1]=t;
        }
        else if(nd[i]==-1)
        {
            int t=w[i][1];
            for(int j=1;j<=7;j++)
                w[i][j]=w[i][j+1];
            w[i][8]=t;
        }
    }
}
 
int rd(int d)
{
    if(d==1return -1;
    else return 1;
}
 
int main()
{
    for(int i=1;i<=4;i++for(int j=1;j<=8;j++)
        scanf("%1d",&w[i][j]);
    scanf("%d",&k);
    while(k--)
    {
        memset(nd,0,sizeof(nd));
        scanf("%d %d",&n,&d);
        nd[n]=d;
        if(n==1)
        {
            for(int i=2;i<=4;i++)
            {
                if(w[i][7]!=w[i-1][3]) nd[i]=rd(nd[i-1]);
                else break;
            }
        }
        else if(n==2)
        {
            if(w[1][3]!=w[2][7]) nd[1]=rd(nd[2]);
            for(int i=3;i<=4;i++)
            {
                if(w[i][7]!=w[i-1][3]) nd[i]=rd(nd[i-1]);
                else break;
            }
        }
        else if(n==3)
        {
            if(w[3][3]!=w[4][7]) nd[4]=rd(nd[3]);
            for(int i=2;i>=1;i--)
            {
                if(w[i][3]!=w[i+1][7]) nd[i]=rd(nd[i+1]);
                else break;
            }
        }
        else if(n==4)
        {
            for(int i=3;i>=1;i--)
            {
                if(w[i][3]!=w[i+1][7]) nd[i]=rd(nd[i+1]);
                else break;
            }
        }
        move();
    }
    printf("%d\n",sum());
    return 0;
}
cs


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

15685 드래곤 커브  (3) 2018.04.16
15686 치킨 배달  (0) 2018.04.16
14890 경사로  (0) 2018.04.09
14889 스타트와 링크  (0) 2018.04.09
14888 연산자 끼워넣기  (0) 2018.04.09
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday