PICNIC 풀이에 관하여 질문입니다.

  • tgchoi
    tgchoi

    PICNIC을 이렇게 풀어 봤습니다.

    만약에 4명의 a,b,c,d라는 친구가 있다고 하였을 때,
    a,b,c,d와의 관계를 그래프로 표현하였습니다.
    표현은 grpah 변수에서 다루게 되었고 upper triangular matrix만 사용하였습니다.
    (서로 symmetric matrix가 되어서요.)
    그리고 멤버에 대한 행렬을 두어 친구들 선택여부를 확인하였습니다.
    이와 같은 방식을 두고 짝을 찾는 과정을 구현하였습니다.

    문제에 나와있는 케이스 외의 다른 케이스는 다뤄보질 않았습니다.
    어떤 케이스를 다뤄야 좋을지 모르겠더라구요...

    혹시 문제가 있는 부분이 있으면 지적해주시고..
    혹시라도 케이스를 만드시는 분이 계시면 케이스 만드는 방법에 대해 조언을 해주시면 감사할거 같습니다~!

    #include <iostream>
    #include <vector>
    #include <string>
    
    using namespace std;
    
    int graph[10][10];
    int member[10], g[10*9/2 + 1];
    int cnt, pairs;
    
    
    int hasPair(){
        int crrIndex = -1;
        for(int i = 0; i < cnt; ++i)
            if(member[i] == 0){
                crrIndex = i;
                break;
            }
    
        if(crrIndex == -1){
            //cout << "done" << endl;
            return 1;
        }
    
        int ret = 0;
        for(int i = crrIndex + 1; i < cnt; ++i){
            if(graph[crrIndex][i] == 1 && member[crrIndex]+member[i] == 0){
                member[crrIndex] = member[i] = 1;
                //cout << "select " << crrIndex << " " << i << endl;
                ret += hasPair();
                member[crrIndex] = member[i] = 0;
                //cout << "release " << crrIndex << " " << i << endl;
            }
        }
        return ret;
    }
    
    void setGraph(){
        for(int i = 0; i < 10; ++i)
            for(int j = 0; j < 10; ++j)
                graph[i][j] = 0;
    
        for(int i = 0; i < pairs * 2; i+=2){
            int row = g[i] < g[i+1] ? g[i] : g[i+1],
                col = g[i] > g[i+1] ? g[i] : g[i+1];
            graph[row][col] = 1;
        }
    }
    
    void showGraph(){
        for(int i = 0; i < cnt; ++i){
            for(int j = 0; j <cnt; ++j)
                cout << graph[i][j] << " ";
            cout << endl;
        }
    }
    
    void initG(){
        for(int i = 0; i < pairs * 2; ++i)
            g[i] = 0;
    }
    
    void initMembers(){
        for(int i = 0; i < 10; ++i)
            member[i] = 0;
    }
    
    int main(){
        int cases = 0; 
        vector<int> ans;
        cin >> cases;
    
        for(int cc = 0 ; cc < cases; ++cc){
            cin >> cnt >> pairs;
    
            initG();
            for(int i = 0 ; i < pairs * 2; ++i)
                cin >> g[i];
            initMembers();
            setGraph();
            //showGraph();
            ans.push_back(hasPair());
        }
        for(int cc = 0 ; cc < cases; ++cc)
            cout << ans[cc] << endl;
    }
    

    8년 전
2개의 댓글이 있습니다.
  • JongMan
    JongMan

    g[] 배열의 크기를 잘 보세요.


    8년 전 link
  • tgchoi
    tgchoi

    앗... ㅎㅎ 자꾸 배열 크기에서 제대로 고려를 못했네요....


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