BACTERIA 런타임 에러

  • berebere86
    berebere86

    BACTERIA 문제를 풀고있는중인데 계속해서 RTE가 나오네요.

    RTE (SIGSEGV: segmentation fault, probably incorrect memory access)

    배열에 잘못접근한것이라 생각해서 랜덤 input을 만들어 실험도 해보았지만
    제 환경에서는 단한번도 segfault가 나오는 경우가 없어서 에러를 찾기가 너무 어렵습니다.

    대체 뭐가 문제일지 도저히 모르겠어서 고수님들 도움 부탁드립니다 :D
    꿈에서 박테리아가 나올 지경이에요ㅎㅎ

    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    #include<vector>
    #include<cmath>
    using namespace std;
    
    char B[505][505];
    bool adj[505][505];
    bool visit[505][505];
    int w,h;
    int cycle;
    
    int getMax2s(int y, int x) {
        if(visit[y][x] || y < 0 || y >= h || x < 0 || x >= w) return 0;
        visit[y][x] = 1;
        int cnt = 1;
        int child = 0;
        if (y-1 >= 0 && adj[y-1][x]) {
            child++;
            cnt += getMax2s(y-1, x);
        }
        if (y+1 < h && adj[y+1][x]) {
            child++;
            cnt += getMax2s(y+1, x);
        }
        if (x-1 >= 0 && adj[y][x-1]) {
            child++;
            cnt += getMax2s(y, x-1);
        }
        if (x+1 < w && adj[y][x+1]) {
            child++;
            cnt += getMax2s(y, x+1);
        }
        cycle = min(cycle, child);
        return cnt;
    }
    
    int main() {
        int cases;
        scanf("%d", &cases);
        while(cases--) {
            scanf("%d %d", &w, &h);
            for (int i = 0; i < h; i++) {
                scanf("%s", B[i]);
            }
            memset(adj, 0, sizeof(adj));
            memset(visit, 0, sizeof(visit));
            for (int i = 0; i < h; i++) {
                for (int j = 0; j < w; j++) {
                    int cnt = 0;
                    if (B[i][j] == '.') continue;
                    if (i-1 >= 0 && B[i-1][j] == '*') cnt++;
                    if (i+1 < h && B[i+1][j] == '*') cnt++;
                    if (j-1 >= 0 && B[i][j-1] == '*') cnt++;
                    if (j+1 < w && B[i][j+1] == '*') cnt++;
                    if (cnt == 2) {
                        adj[i][j] = 1;
                    }
                }
            }
            int maxv = 0;
            cycle = 1000;
            for (int i = 0; i < h && cycle != 2; i++) {
                for (int j = 0; j < w; j++) {
                    if (!adj[i][j] || visit[i][j]) continue;
                    cycle = 1000;
                    int res = getMax2s(i, j);
                    if (cycle == 2) break;
                    maxv = max(maxv, res);
                }
            }
            if (cycle == 2) printf("-1\n");
            else printf("%d\n", (maxv+1)/2+1);
        }
    }
    

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

    스택 오버플로우에 유의하세요~


    10년 전 link
  • heekyu
    heekyu

    아마도 stack overflow 일 확률이 가장 높을 것 같습니다.
    getMax2s 함수가 500*500 의 depth로 내려갈 수 있으니까요..
    recursion을 stack을 이용한 구현으로 바꾸고 다시 한 번 해보세요.


    10년 전 link
  • berebere86
    berebere86

    오오오 그런거군요!
    probably incorrect memory access 라고 해서 스택오버플로우 일거라곤 전혀 생각을 못하고 엄한곳에서 헤메고 있었네요ㅎㅎ
    혹시 잘못된 index 접근과 stack overflow가 에러가 구분이 가능하다면저같은 초짜들을 위해 상세한 RTE 오류 정보를 알려주셔도 좋을것 같아요~


    10년 전 link
  • JongMan
    JongMan

    그 두 개를 서로 구분하는건 아주아주 어려운 일이고요.. 대신 에러 메시지에 스택 오버플로우도 언급하기로 했습니다. ^^;;


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