[Brute-force] Synchronizing Clocks

2021. 1. 1. 11:55알고리즘/알고리즘 문제 [easy]

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
#include <iostream>
#include <vector>
#include <algorithm>
 
int clocks[4][4= {0,};
int switchPushNum[10= {0,};
std::vector<std::vector<int>> switchToClock = {
    {012}, 
    {37911},
    {4101415},
    {04567},
    {6781012},
    {021415},
    {31415},
    {4571415},
    {12345},
    {345913}
};
std::vector<std::vector<int>> clockToSwitch(16);
 
void pushSwitch(int switchNum, int direction)
{
    int y = 0, x = 0, tmp = 0;
    for(int i = 0; i < switchToClock[switchNum].size(); i++)
    {
        y = switchToClock[switchNum][i] / 4;
        x = switchToClock[switchNum][i] % 4;
        tmp = clocks[y][x] + direction*3;
        clocks[y][x] = (tmp == 0 ? 12 : (tmp == 15 ? 3 : tmp));
    }
}
 
int to12(int count)                                                             
{
    int ret = 987654321, starty = 0, startx = 0, startNum = 0, switchNum = 0, count2 = 0;
    
    
    
    for(int i = 0; i <4; i++)
    {
        for(int j = 0; j < 4; j++)
        {
            if (clocks[i][j] != 12)
            {
                starty = i;
                startx = j;
                break;
            }
            count2++;
        }
    }
    if (count2 == 16return count;
 
    startNum = starty*4 + startx;
    for(int i = 0; i < clockToSwitch[startNum].size(); i++)
    {
        
        switchNum = clockToSwitch[startNum][i];
        if(switchPushNum[switchNum]+ 1 < 4 )
        {
            switchPushNum[switchNum] +=1;
            pushSwitch(switchNum, 1);
            ret = std::min(to12(count + 1), ret);
            pushSwitch(switchNum, -1);
            switchPushNum[switchNum] -=1;   
        }
    }
 
    return ret;
}
 
int main(void)
{
    int testCase = 0, ret = 0;
    
    for(int i = 0; i < 10; i++)
        for(int j = 0; j < switchToClock[i].size(); j++)
           clockToSwitch[switchToClock[i][j]].push_back(i);
    
    std::cin>>testCase;
    for(int i = 0; i < testCase; i++)
    {
        for(int j = 0; j < 4; j++)
            for(int k = 0; k < 4; k++)
                std::cin>>clocks[j][k];
        ret = to12(0);
        if(ret == 987654321)
            std::cout<<-1<<std::endl;
        else
            std::cout<<ret<<std::endl;
    }
}
cs

 

 

 

 

1. 완전탐색

    12시가 아닌 시계를 찾고

    그 시계를 움직이는 스위치들 각각의 누르는 경우를 센다.

    (4번 누르면 원상태이므로 3번까지만 누른다.)

 

2. 스위치 -> 시계 배열과 시계 -> 스위치 배열을 만들어 쉽게 접근할 수 있도록 했다

 

3. 12시가 아닌 시계를 찾는게 아니라 

    10개의 스위치들을 0~3번 누르는 각각의 경우의 수에서 

    전체 시계가 12시인 것중 가장 적게 스위치를 누른 경우를 찾으면

    더 빠른 시간 안에 문제를 해결할 수 있다. 

 

Synchronizing Clocks