PICNIC 문제 질문드립니다. 고수님들 도와주세요.

  • doubleknd
    doubleknd

    계속 런타임 오류 RTE(nonzero return code) 가 발생하는데
    원인을 잘 모르겠습니다ㅜㅜ
    혹시 exit(1) 이 부분이 걸리는건가요 ?ㅜ
    답변 주시면 감사하겠습니다.

    #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,};
    
        char gar=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, &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);
            }
            // if m = 0
            if (m==0) {
                printf ("\n");
                test_case--;
                continue;
            }
    
            scanf ("%c",&gar);  // garbage.
            set_friends(are_friends, n, m);
    
            result = count_parings(are_friends, taken, n);
    
            printf ("%d\n",result);
    
            test_case--;
        }
    
        printf ("Program Exit.\n");
        return 0;
    }
    
    // 짝을 입력받는 함수입니다.
    void set_friends (int are_friends[][10], int n, int m) {
    
        int i=0;
        int num=0, len=0;
        int x=-1, y=-1;
        char temp[81]={0,};
    
    
        fgets(temp, sizeof(temp), stdin);
        temp[strlen(temp)-1] = '\0';
    
        len = (int)strlen(temp);
    
        for (i=0 ; i<len ; i++) {
            if ( temp[i]!=' ' ) {
                num = temp[i]-'0';
    
                if ( num<0 || num>n-1) {
                    printf (" 0<= Student number <= n-1.\n");
                    exit(1);
                }
    
                if (x==-1) {
                    x = num;
                }
                else {
                    y = num;
                    are_friends[x][y] = 1;
                    are_friends[y][x] = 1;
                    x = y = -1;
                }
    
            }
        }
    
    }
    
    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년 전
5개의 댓글이 있습니다.
  • kcm1700
    kcm1700

    fgets가 한 줄을 온전히 다 받지 않고 있네요. 80자로 하신 이유가 있나요?


    9년 전 link
  • doubleknd
    doubleknd

    굳이 이유를 말씀드리자면 한 줄이 80자로 알고 있어서 입니다!ㅜ
    fgets가 한 줄을 온전히 다 입력받지 않는다고 말씀하셨는데
    제 생각엔 입력이 80자가 넘어가지 않을 것 같은데 그 부분이 어떻게 그리고 왜 문제가 되는지 알고 싶습니다!!
    그리고 저 부분을 그럼 어떤 식으로 바꿔야 하나요??


    9년 전 link
  • doubleknd
    doubleknd

    scanf로 받으면 스페이스를 못받아서 fgets를 사용했습니다!ㅜ


    9년 전 link
  • kcm1700
    kcm1700

    입력은 80자를 충분히 넘을 수 있습니다.


    9년 전 link
  • kcm1700
    kcm1700

    그리고 이런 경우

    scanf("%d%d",&n,&m);
    for (int i = 0; i < m; i++) scanf("%d%d",&a[i],&b[i]);
    

    와 같은 식으로 작성하여도 입력을 제대로 받을 수 있어요.


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