CLOCKSYNC 문제 오답

  • sypark9
    sypark9

    안녕하세요.
    ClockSync 문제를 풀었는데
    오답의 경우를 스스로 찾아내지 못해서 도움을 구하고자 합니다.
    간단한 예제의 경우는 정답이 나오는 상황입니다.

    감사합니다.

    코드 블럭 문법 예제

    코드 블럭 문법을 다음과 같이 사용하실 수 있습니다.

    // CLOCKSYNC.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
    //
    #include <stdio.h>
    
    
    int switchs[10][5] = {  
        {0,1,2,-1,-1},
        {3,7,9,11,-1},
        {4,10,14,15,-1},
        {0,4,5,6,7},
        {6,7,8,10,12},
        {0,2,14,15},
        {3,14,15},
        {4,5,7,14,15},
        {1,2,3,4,5},
        {3,4,5,9,13}
    };
    
    
    int clocks[16];
    int count;
    int minCount;
    
    int clock_sync(int switchNum);
    int push_switch(int switchNum, int pushNum);
    void push_switch_back(int switchNum, int pushNum);
    
    int check_clocks(void);
    
    int main(void)
    {
        int cases;
        int i;
    
        //freopen("input.txt","r", stdin);
    
        scanf("%d",&cases);
    
        while(cases--)
        {
            for(i=0;i<16;i++)
            {
                scanf("%d",&clocks[i]);
            }
    
            if(clock_sync(0)==1)
                printf("%d\n",minCount);
            else
                printf("-1\n");
        }
    
        return 0;
    }
    
    int clock_sync(int switchNum)
    {
        int pushNum;
    
        //printf("swichNum = %d\n",switchNum);
    
        // 기저사례 체크후 맞으면 return
        if( switchNum == 0 )
        {
            count = 0;
            minCount = 9999;
        }
    
        if(check_clocks() == 1)
        {
            if(count < minCount)
                minCount = count;
    
            return 1;
        }
    
        if( switchNum > 9)
            return 0;
    
    
        for( pushNum=0; pushNum <4; pushNum++) {
    
            push_switch(switchNum, pushNum);
            count += pushNum;
    
            clock_sync(switchNum+1);
    
            // push_switch 원상복구
            push_switch_back(switchNum, pushNum);
            count -= pushNum;
    
        }
    
        if( minCount == 9999 )
            return 0;
        else 
            return 1;
    }
    
    int push_switch(int switchNum, int pushNum)
    {
        int i,j;
        int clockNum;
    
        //printf("s=%d p=%d\n",switchNum,pushNum);
    
        //if(switchNum == 8 && pushNum == 2)
            //printf("");
    
        if(pushNum == 0)
            return 1;
    
        for(i=0;i<5;i++) {
    
            clockNum = switchs[switchNum][i];
            if(clockNum != -1)
            {
                clocks[clockNum] += 3*pushNum;
                if(clocks[clockNum] > 12)
                    clocks[clockNum] %= 12;
            }
        }
    
        if(check_clocks() == 1)
            return 1;
        else 
            return 0;
    }
    
    void push_switch_back(int switchNum, int pushNum)
    {
        int i,j;
        int clockNum;
    
        for(i=0;i<5;i++) {
    
            clockNum = switchs[switchNum][i];
            if(clockNum != -1)
            {
                clocks[clockNum] += 3*(4-pushNum);
    
                if(clocks[clockNum] > 12)
                    clocks[clockNum] %= 12;
            }
        }
    }
    
    
    int check_clocks(void)
    {
        int i,j;
    
        for(i=0; i<16;i++)
        {
            if( clocks[i] != 12)
                break;
        }
    
    #if 0
        for(j=0; j<16;j++)
        {
            printf("%d ",clocks[j]);    
        }
        printf("\n");
    #endif
    
        if( i== 16)
            return 1;
        else
            return 0;
    }
    

    앞과 뒤에 빈 줄 하나씩을 반드시 추가하셔야 합니다.


    10년 전
1개의 댓글이 있습니다.
  • sypark9
    sypark9

    (자문자답) 제 경우는 입력 데이터에서 -1을 빼먹은 부분이 있어 발생했던 오답이었습니다.


    10년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.