안녕하세요 PICNIC문제 질문합니다..

  • doubleknd
    doubleknd

    안녕하세요.
    PICNIC문제 워낙 어려워서 책에 나와있는 알고리즘 사용하여 문제를 풀어보았습니다. (완전탐색, 재귀함수 사용)
    그런데 런타임 오류
    RTE (SIGABRT: program aborted, probably assertion fail)
    가 계속 떠서 이렇게 질문드립니다.
    어느 부분에서 오류가 나는건지 알려주시면 감사하겠습니다!

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    void set_friends (int [][10], int, int);
    int count_parings(int [][10], int [], int);
    
    int main() {
    
        int i=0, j=0;
        int n=0, m=0;   //n은 학생 수, m 은 짝의 수 입니다.
        int test_case=0;
        int result=0;
        int taken[10] = {0,};
        int are_friends[10][10] = {0,};
    
        scanf ("%d", &test_case);
        if ( test_case<0 || test_case >50) {
            printf ("Error: 0<Testcase<= 50\n");
            exit(0);
        }
    
        while ( test_case>0) {
    
            // initialization.
            for (i=0 ; i<10 ; i++) {
                taken[i] = 0;
                for (j=0 ; j<10 ; j++) {
                    are_friends[i][j] = 0;
                }
            }
    
            scanf ("%d %d\n",&n, &m);
    
            // check boudary of n
            if (n<2 || n>10) {
                printf ("Error: 2<=N<=10\n");
                exit(1);
            }
            else if (n%2) {
                printf ("Error : The number of student must be even number.\n");
                exit(1);
            }
            // check boundary of m
            if ( m<0 || m>(n*(n-1))/2 ) {
                printf ("Error: 0<=M<=n(n-1)/2\n");
                exit(1);
            }
    
            set_friends(are_friends, n, m);
    
            result = count_parings(are_friends, taken, n);
    
            printf ("%d\n",result);
    
    
            test_case--;
        }
    
        return 0;
    }
    
    // 짝을 입력받는 함수입니다.
    void set_friends (int are_friends[][10], int n, int m) {
    
        int count=0;
        int coordinate=0, x=0, y=0;
        char *token=NULL;
        char temp[30]={0,};
    
    
        gets(temp);
    
        token = strtok(temp," ");
    
        x = y = -1;
        while (token) {
            coordinate = atoi(token);
    
            if ( coordinate<0 || coordinate>=n) {
                printf ("Error: 0 <= Stundent number <= n-1\n");
                exit(1);
            }
    
            if (x==-1) {
                x = coordinate;
            }
            else if (y==-1) {
                y = coordinate;
            }
    
            if (x!=-1 && y!=-1) {
                are_friends[x][y] = 1;
                are_friends[y][x] = 1;
    
                x=-1;
                y=-1;
            }
    
            token = strtok(NULL, " ");
            count++;
        }
     }
    
    int count_parings(int are_friends[][10], int taken[], int n) {
    
        int ret=0, pair_with=0;
        int first_free = -1;
    
        for (int i=0 ; i<n ; i++) {
            if (!taken[i]) {
                first_free = i;
                break;
            }
        }
    
        if (first_free == -1) {
            return 1;
        }
    
        for (pair_with = first_free+1 ; pair_with<n ; pair_with++) {
    
            if ( !taken[pair_with] && are_friends[first_free][pair_with] ) {
                taken[first_free] = taken[pair_with] = 1;
                ret += count_parings(are_friends, taken, n);
                taken[first_free] = taken[pair_with] = 0;
            }
    
        }
    
        return ret;
    
    
    }
    

    9년 전
3개의 댓글이 있습니다.
  • JongMan
    JongMan

    배열 크기를 확인해 보세요.


    특히 temp요.

    그걸 고치셔도 여전히 문제가 되는 부분이 있는데..

    아래 입력을 돌려보세요

    2
    2 0

    2 1
    1 2


    9년 전 link
  • hakgb
    hakgb

    입력 조건에 보면 n은 0보다 작은 수라고 명시되어 있는데..
    1 2 라는 입력은 잘못된거 아닌가요?


    9년 전 link
  • JongMan
    JongMan

    아 그러네요; 죄송. 0 1 로 바꾸시고요. 문제는 두 번째 테스트 케이스가 아니라, 빈 줄이 잘 처리가 안 되는 쪽인 것 같더라고요. 그냥 scanf() 쓰시는걸 추천해요~


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