ALLERGY(알러지가 심한 친구들)에서 오답을 찾을수가 없습니다.

  • ghost3320
    ghost3320

    BFS방식으로 다음과 같이 풀었습니다.

    나름 만들어본 테스트케이스는 모두 만족하는데..

    도저히 오답을 찾을수가 없습니다.

    고수님들의 조언부탁드립니다

    #include <iostream>
    using namespace std;
    int friendCnt[50],foodCnt[50];
    
    bool friendCheck[50];
    string friendList[50][50];
    int foodFriedCnt[50][50];
    int foodFried[50][50][50];
    int queue[5000][50];
    int queueItem[5000];
    int queuePreIndex = 0;
    int queueIndex = 0;
    int queueSize = 5000;
    
    int* valueList;
    int queueItemSize;
    
    void push(int* item, int size) {
        queueItem[queueIndex%queueSize] = size;
        int* target = queue[queueIndex%queueSize];
    
        for(int i = 0; i <size; i++ ) {
            target[i] = item[i];
        }
        queueIndex++;
    }
    
    void pop() {
    
        int* data = queue[queuePreIndex%queueSize];
        valueList = data;
        queueItemSize = queueItem[queuePreIndex%queueSize];
    
        queuePreIndex++;
    }
    
    bool isAccept(int tcIndex, int* valList, int queueSize) {
    
        for(int j = 0; j < friendCnt[tcIndex]; j++) {
            friendCheck[j] = false;
        }
    
        for(int i = 0; i < queueSize; i++) {
            int friendCnt2 = foodFriedCnt[tcIndex][valList[i]];
            for(int j = 0; j < friendCnt2; j++) {
                friendCheck[foodFried[tcIndex][valList[i]][j]] = true;
            }
    
        }
    
        for(int j = 0; j < friendCnt[tcIndex]; j++) {
            if(!friendCheck[j]) {
                return false;
            }
        }
        return true;
    }
    int searchFoods(int tcIndex) {
    
    
        int newItem[50];
    
        while(queuePreIndex != queueIndex) {
            pop(); // quq에서 pop
    
            if(queueItemSize > foodCnt[tcIndex]){
                return -1;
            }
            else if(isAccept(tcIndex,valueList,queueItemSize)) {
                return queueItemSize;
            } else {
                for(int i = 0; i < queueItemSize; i++) {
                    newItem[i] = valueList[i];
                }
                for(int i = valueList[queueItemSize-1]+1; i < foodCnt[tcIndex]; i++) { //인접 리스트 push
                    newItem[queueItemSize] = i;
                    push(newItem,queueItemSize+1);
                }
            }
        }
        return 0;
    }
    
    int main(int argc, char** argv) {
        int tcCount,index = 0;
        cin >> tcCount;
    
        string userName;
        while(index<tcCount) {
            cin >> friendCnt[index] >> foodCnt[index];
    
            for(int i = 0; i < friendCnt[index]; i++) {
                cin >>friendList[index][i];
            }
    
            for(int i = 0; i < foodCnt[index]; i++) {
                cin >> foodFriedCnt[index][i];
                for(int j = 0; j < foodFriedCnt[index][i]; j++) {
                    cin >> userName;
    
                    for(int k = 0; k < friendCnt[index]; k++) {
                        if(userName.compare(friendList[index][k])==0) {
                            foodFried[index][i][j] = k;
                            break;
                        }
                    }
                }
            }
            index++;        
        }
        index = 0;
    
        while(index<tcCount) {
            int firstArr[1];
            for(int i = 0; i < foodCnt[index]; i++) {
                firstArr[0] = i;
                push(firstArr,1);
            }
            cout <<searchFoods(index)<<endl;
            index++;
            queuePreIndex = 0;
            queueIndex = 0; 
        }
        return 0;
    }

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