티스토리 뷰

Algorithm/ALGOSPOT

CLOCKSYNC

henry1214 2021. 6. 7. 13:11

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

 

algospot.com :: CLOCKSYNC

Synchronizing Clocks 문제 정보 문제 그림과 같이 4 x 4 개의 격자 형태로 배치된 16개의 시계가 있다. 이 시계들은 모두 12시, 3시, 6시, 혹은 9시를 가리키고 있다. 이 시계들이 모두 12시를 가리키도록

algospot.com

 

각각의 스위치들과 연결된 시계가 있다. 스위치를 누를때마다 시간이 3시간 흐른다. (12->3->6->9)

이 때 모든 시계를 12시로 돌리기 위해 스위치를 최소 몇 번 눌러야 할지 계산해야한다.

먼저 스위치를 4번 누르면 다시 원상태로 돌아온다. 그러므로 스위치를 안 누르거나 최대 3번 누르는 것으로 한정시킬 수 있다.

스위치가 10개 있으므로 전체 경우의 수는 4^10이고 이는 완전 탐색으로 해결할 수 있다.

 

clocks : 현재 시계들의 상태

linked[i][j] : i번 스위치와 j번 시계가 연결되어 있으면 1, 그렇지 않으면 0

solve(swtch) : swtch는 이번에 누를 스위치 번호를 의미한다. 0번부터 9번까지 차례대로 최대 3번 누르면 된다. 코드 상으로는 push가 총 4번 호출되므로 다시 원상태로 돌아오게 된다.

 

#include <cstdio>
#include <algorithm>
#define INF 987654321
using namespace std;

int t,clocks[16];
char linked[10][17]={
    "1110000000000000",
    "0001000101010000",
    "0000100000100011",
    "1000111100000000",
    "0000001110101000",
    "1010000000000011",
    "0001000000000011",
    "0000110100000011",
    "0111110000000000",
    "0001110001000100"
};

bool check()
{
    for(int i=0;i<16;i++)
        if(clocks[i]!=12)
            return false;
    return true;
}

void push(int swtch)
{
    for(int clock=0;clock<16;clock++)
    {
        if(linked[swtch][clock]=='1')
        {
            clocks[clock]+=3;
            if(clocks[clock]==15) clocks[clock]=3;
        }
    }
}

int solve(int swtch)
{
    if(swtch==10) return check()?0:INF;
    int ret=INF;
    for(int cnt=0;cnt<4;cnt++)
    {
        ret=min(ret,cnt+solve(swtch+1));
        push(swtch);
    }
    return ret;
}

int main()
{
    scanf("%d",&t);
    while(t--)
    {
        for(int i=0;i<16;i++)
            scanf("%d",&clocks[i]);
        int ans=solve(0);
        printf("%d\n",ans!=INF?ans:-1);
    }
    return 0;
}

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

FENCE  (0) 2021.06.07
QUADTREE  (0) 2021.06.07
BOARDCOVER  (0) 2021.06.07
PICNIC  (0) 2021.06.07
BOGGLE  (0) 2021.06.07
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday