문제 : https://algospot.com/judge/problem/read/CLOCKSYNC


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
138
139
140
141
142
143
144
145
#include <iostream>
#include <vector>
 
 
class ClockSet
{
public:
    static const int SWITCHES = 10;        //스위치 개수
    static const int CLOCKS = 16;        //시계 개수
    const int INF = 987654321;
    int mMinCount;
 
 
    //mLinked[i][j] = 'x' : i번 스위치와 j번 시계가 연결되어있다.
    //mLinked[i][j] = '.' : i번 스위치와 j번 시계가 연결되어있지 않다.
    const char mLinked[SWITCHES][CLOCKS+1= {
        "xxx.............",
        "...x...x.x.x....",
        "....x.....x...xx",
        "x...xxxx........",
        "......xxx.x.x...",
        "x.x...........xx",
        "...x..........xx",
        "....xx.x......xx",
        ".xxxxx..........",
        "...xxx...x...x.."
    };
 
    std::vector<int> mClockSet;
 
 
 
 
    void CountSwitch();
 
    //parClocks 현재 시계들의 상태
    //parSwitch 이번에 누를 스위치의 번호
    //가 주어질 때, 남은 스위치들을 눌러서 parClocks를 12시로 맞출 수 있는 최소 횟수를 반환한다.
    //만약 불가능하다면 INF 이상의 큰 수를 반환한다.
    int Solve(std::vector<int>& parClocks, int parSwitch);
 
private:
    //모든 시계가 12시를 가리키고 있는지 확인한다.
    bool _AreAligned(const std::vector<int>& parClocks);
    // parSwitch번 스위치를 누른다.
    void _Push(std::vector<int>& parClocks, int parSwtich);
    
};
 
 
int main()
{
    std::vector<ClockSet> clockList;
    int nTestCase;
 
 
    std::cin >> nTestCase;
    getchar();
 
    for (int i = 0; i < nTestCase; ++i)
    {
        ClockSet tmpClockSet;
        tmpClockSet.mClockSet.clear();
        for (int j = 0; j < 16++j)
        {
            int tmpTime;
            std::cin >> tmpTime;
            tmpClockSet.mClockSet.push_back(tmpTime);
        }
        getchar();
 
        clockList.push_back(tmpClockSet);
    }
 
 
    for (auto tmp : clockList)
    {
        tmp.CountSwitch();
        if (tmp.mMinCount == tmp.INF)
        {
            std::cout << -1 << std::endl;
        }
        else
        {
            std::cout << tmp.mMinCount << std::endl;
        }
    }
 
 
    return 0;
}
 
void ClockSet::CountSwitch()
{
 
    mMinCount = Solve(mClockSet, 0);
 
}
 
int ClockSet::Solve(std::vector<int>& parClocks, int parSwitch)
{
    if (parSwitch == SWITCHES)
    {
        return _AreAligned(parClocks) ? 0 : INF;
    }
    //이 스위치를 0번 누르는 경우부터 세 번 누르는 경우까지를 모두 시도한다.
    int ret = INF;
    for (int cnt = 0; cnt < 4++cnt)
    {
        int tmpRet = cnt + Solve(parClocks, parSwitch + 1);
        if (ret > tmpRet)
        {
            ret = tmpRet;
        }
        _Push(parClocks, parSwitch);
    }
 
    return ret;
}
 
bool ClockSet::_AreAligned(const std::vector<int>& parClocks)
{
    for (auto clock : parClocks)
    {
        if (clock != 12)
            return false;
    }
    return true;
}
 
void ClockSet::_Push(std::vector<int>& parClocks, int parSwtich)
{
    for (int clock = 0; clock < CLOCKS; ++clock)
    {
        if (mLinked[parSwtich][clock] == 'x')
        {
            parClocks[clock] += 3;
            if (parClocks[clock] == 15)
            {
                parClocks[clock] = 3;
            }
        }
    }
}
 
cs

+ Recent posts