PICNIC c++ 런타임에러를 못잡겠습니다 ..

  • auddn521
    auddn521

    런타임에러잡는 질문 찾아봤는데 배열 할당에서 문제가생길 확률이 높대서 다시한번 점검했는데.. 모르겠습니다.

    코드가 길어서 설명하자면
    cin 으로 c 입력받고
    입력받은 c 만큼 답의 개수를 (int * ans) 에 동적할당해줍니다.

    다음으로 n 과 m 을 입력받고
    n 개수만큼 (bool **student) 에 n*n 배열을 동적할당하구요
    m 만큼 루프돌며 해당배열을 채웁니다.

    재귀부분으로 연산하고 연산이 끝난답은 ans[0]부터 저장하구요

    다음 n 입력받기 전에 할당해준 n*n 배열 delete 해주고,
    친구인지 검사하는 배열 bool *find 도 delete 해주고..

    n과 m 이 다시 입력될때 다시 할당합니다...

    도저히 모르겠어요.. 알고스팟 이용하는게 처음이라서 더욱 ㅠㅠ
    도와주시면 감사하겠습니다

    ~c++
    #include
    using namespace std;

    int countPairings(bool * & taken,int n, bool * * & areFriends);

    int main()
    {
    int c; //테스트케이스수
    int n; // 학생수 짝수 ( 2이상)
    int m; //짝인 학생수 (0<= m <= n(n-1)/2)
    bool * * student; //학생친구관계 저장할 2차원배열 할당
    int * ans; //답 할당 동적할당
    int frd1,frd2; //친구표시 입력받을 임시변수
    bool * find;// 친구를 찾았을경우 true 표시;
    cin>> c; //테이스케이스 입력
    ans = new int[c];

    int tmpc = c;
    while(c)
    {
        cin>>n;
        cin>>m;
    
        //////////////////////////////////////
        //학생수만큼 2차원 배열 동적할당부분//
        student = new bool*[n];
        find = new bool[n];
        for(int i=0;i<n;i++)
        {
            student[i] = new bool[n];
            for(int j=0;j<n;j++)
            {
                student[i][j] = false;
            }
            find[i] = false;
        }
    
        //////////////////////////////////////
    
    
        //////////////////////////////////////
        //친구인 학생 입력받는 부분//
        while(m)
        {
            cin>>frd1;
            cin>>frd2;
    
            student[frd1][frd2] = true;
            student[frd2][frd1] = true;
    
            m--;
        }
        //////////////////////////////////////
    
        //////////////////////////////////////
        //연산//
    
        ans[3-c]=countPairings(find,n,student);
    
        for(int j=0;j<n;j++)
        {
            delete [] student[j];
        }
        delete [] student;
        delete [] find;
        c--;
    }
    cout<<endl;
    for(int i=0;i<tmpc;i++)
    {
        cout<<ans[i]<<endl;
    }
    
    delete [] ans;
    
    return 0;

    }
    int countPairings(bool * &taken,int n,bool * * & areFriends)
    {
    int firstFree = -1;

    for(int i=0;i<n;i++)
    {
        if(!taken[i])
        {
            firstFree = i;
            break;
        }
    }
    
    if(firstFree==-1)
    {
        return 1;
    }
    
    int ret = 0;
    
    for(int pairWith = firstFree+1; pairWith<n; pairWith++)
    {
        if(!taken[pairWith] && areFriends[firstFree][pairWith])
        {
        taken[firstFree] = taken[pairWith] = true;
        ret += countPairings(taken,n,areFriends);
        taken[firstFree] = taken[pairWith] = false;
        }
    
    }
    return ret;

    }


    10년 전
4개의 댓글이 있습니다.
  • auddn521
    auddn521

    해결했습니다... 왠진 모르겠는데 while 을 for 문으로 전부다 바꾸니까 되네요... 진짜 미스테리.. ㅜㅜ 어쨋든 성공..!!


    10년 전 link
  • auddn521
    auddn521

    이부분에 대해 아시는분 답변해주시면 감사하겠습니다..;;;


    10년 전 link
  • nailbrainz
    nailbrainz

    음..while문을 돌 땐 c를 감소시켜가는데
    가운데에 있는 ans[3-c]=countPairings(find,n,student); 때문에 그런 거 아닐까요? 케이스 개수가 3개일지 아닐지는 잘 모르니까요


    10년 전 link
  • auddn521
    auddn521

    와 맞네요!!! 감사합니다 아주 기초적인거였군요 ㅜㅜ ㅋㅋㅋㅋㅋ


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