QuadTree 런타임 에러 질문 있습니다.

  • Jinsanger
    Jinsanger

    QuadTree 문제를 풀었는데 계속 런타임 에러가 나네요.ㅠ
    코드가 어딘가 불안정 한 것 같은데, 어떤 부분에서 불안정한지
    잘 모르겠습니다. QuadTree라서 배열 사이즈도 그에 맞게 4개로 제한하고 그에 대한 예외처리도 해줬거든여.
    고수님들 답변 부탁드립니다 ㅠ

    간단히 얘기하자면 리스트 형식으로 각 노드가 사이즈 4인 배열을 갖는 트리구조를 짰고, 뒤집는 연산은 순회하면서 처리했습니다.

    //#include <iostream>
    //using namespace std;
    #include <stdio.h>
    #include <string.h>
    
    typedef struct QuadNode{
        char color;
        QuadNode* parent;
        QuadNode* children;
        int childrenCnt;
    }QuadNode;
    
    class QuadTree{
    public:
        QuadTree() : rootNode(0), currentNode(0), size(0){
        }
        void Insert(char color){
            if(size == 0){
                QuadNode* newNode = new QuadNode;
                newNode->color = color;
                newNode->children= new QuadNode[4];
                newNode->childrenCnt=0;
                newNode->parent=0;
    
                rootNode = newNode;
                currentNode = rootNode;
                size++;
                return ;
            }
            QuadNode* newNode = new QuadNode;
            newNode->color = color;
            newNode->children = new QuadNode[4];
            newNode->childrenCnt=0;
            newNode->parent=0;
    
            if(currentNode->color != 'x')
                return ;
            if(isFull())
                return ;
            currentNode->children[currentNode->childrenCnt] = (*newNode);
            currentNode->children[currentNode->childrenCnt].parent = currentNode;
            currentNode->childrenCnt++;
        }
        void UpLayer(){
            if(currentNode->parent != 0)
                currentNode = currentNode->parent;
        }
        void DownLayer(int childIndex){
            if(currentNode->childrenCnt >= childIndex)
                currentNode = &(currentNode->children[childIndex]);
        }
        void ChildSwap(){
            if(currentNode->color == 'x' && (currentNode->childrenCnt == 4)){
                QuadNode tempNode;
                tempNode = currentNode->children[0];
                currentNode->children[0] = currentNode->children[2];
                currentNode->children[2] = tempNode;
                tempNode = currentNode->children[1];
                currentNode->children[1] = currentNode->children[3];
                currentNode->children[3] = tempNode;
            }
        }
        void SwapPreorder(QuadNode& node){
            currentNode = &node;
            ChildSwap();
            for(int i=0; i<node.childrenCnt; i++){
                SwapPreorder(node.children[i]);
            }
        }
        void PrintPreorder(QuadNode& node, char buff[1000], int& buffCnt){
            currentNode = &node;
            buff[buffCnt] = node.color;
            buffCnt++;
            for(int i=0; i<node.childrenCnt; i++){
                PrintPreorder(node.children[i], buff, buffCnt);
            }
        }
        void CurrentToRoot(){
            currentNode = rootNode;
        }
        QuadNode& GetRootNode(){
            return (*rootNode);
        }
        bool isFull(){
            if(currentNode->childrenCnt == 4)
                return true;
            return false;
        }
        int GetChildrenCount(){
            return currentNode->childrenCnt;
        }
        int Count(){
            return size;
        }
    private:
        QuadNode* rootNode;
        QuadNode* currentNode;
        int size;
    };
    
    int main(void){
        int C=0, caseCnt=0;
        char resultSet[50][1001] = {0, };
        int i=0;
        scanf("%d", &C);
        getchar();
        while(caseCnt<C){
            char picStr[1001] = {0, };
            int picStrCnt=0;
            QuadTree quadTree;
            char strBuff[1001] = {0, };
            int buffCnt=0;
    
            while(1){
                char ch = getchar();
                if(ch == 10)
                    break;
                picStr[picStrCnt] = ch;
                picStrCnt++;
            }
            quadTree.Insert(picStr[0]);
            for(i=1; i<picStrCnt; i++){
                if(picStr[i]=='x'){
                    quadTree.Insert(picStr[i]);
                    quadTree.DownLayer(quadTree.GetChildrenCount()-1);
                    continue;
                }
                quadTree.Insert(picStr[i]);
                if(quadTree.GetChildrenCount()==4){
                    quadTree.UpLayer();
                }
            }
            quadTree.SwapPreorder(quadTree.GetRootNode());
            quadTree.CurrentToRoot();
            quadTree.PrintPreorder(quadTree.GetRootNode(), strBuff, buffCnt);
    
            strcpy(resultSet[caseCnt], strBuff);
            caseCnt++;
        }
        for(i=0; i<caseCnt; i++){
            printf("%s\n", resultSet[i]);
        }
        return 0;
    }
    

    10년 전
1개의 댓글이 있습니다.
  • qetuoqq
    qetuoqq

    사진이 문제인것 같습니다.


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