QUADTREE문제 질문합니다.

  • teran0729
    teran0729
    #include <iostream>
    #include <string.h>
    
    using namespace std;
    
    void flip(char* arr,int n1,int n4,int n5,int n8);
    int devide(char* arr,int n){
        if(arr[n]=='x'){
            int n1 = devide(arr,n+1);
            int n2 = devide(arr,n1);
            int n3 = devide(arr,n2);
            int n4 = devide(arr,n3);
            flip(arr,n+1,n2-1,n2,n4-1);
            return n4;
        }else{
            return n+1;
        }
    
    }
    
    void flip(char* arr,int n1,int n2,int n3,int n4){
        char temp1[625+1]; 
        char temp2[625+1]; 
        memcpy(temp1,&arr[n1],(n2-n1+1)*sizeof(char));
        memcpy(temp2,&arr[n3],(n4-n3+1)*sizeof(char));
        memcpy(&arr[n1],temp2,(n4-n3+1)*sizeof(char));
        memcpy(&arr[n1+n4-n3+1],temp1,(n2-n1+1)*sizeof(char));
    
    
    }
    
    int main(){
        int n = 0;
        cin>>n;
        while(n>0){
            char arr[625+1];
            cin>>arr;
            devide(arr,0);
            cout<<arr;
            n--;
        }
    
    
    }
    

    QUADTREE 에 위 답변을 제출하면 계속 RTE (SIGABRT: program aborted, probably assertion fail) 런타임 에러가 납니다.

    알고리즘을 간략하게 설명드리겠습니다.
    xbbww가 주어졌을때 bb와 ww의 자리를 교환하면 이미지가 위아래 반전되는것을 알수 있습니다. 즉,

    1.주어진 인풋을 부분문제로 나눠 부문문제내에서 더이상 'x'가 없을때 앞2개와 뒤 2개를 flip 합니다.
    2.그리고 부분문제가 끝나는 인덱스를 리턴합니다.
    3.얻어진 n1 , n2,n3,n4를 이용하면 더 큰 부분문제를 풀 수 있습니다.

    메모리 문제인가 해서 동적할당한 배열도 고정된 길이의 배열로도 바꿔봤고 그외 여러가지 자잘한 시도를 해봤는데 뭐가 문제인지 모르겠습니다. 도와주세요. ㅠ


    9년 전
2개의 댓글이 있습니다.
  • VOCList
    VOCList

    원본 문자열의 길이는 1,000을 넘을 수 없다는 조건이 있는데 위 코드에서 받을 수 있는 최대 길이는 625인 것 같네요.


    9년 전 link
  • teran0729
    teran0729

    아.. 감사합니다! ㅠ


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