JUMPGAME C++ 런타임 에러 질문 올립니다.

  • kim08277
    kim08277

    DP없이 완전탐색만으로 우선해보고싶어서 작성한 코드입니다.
    런타임 에러 내용은
    RTE (SIGSEGV: segmentation fault, probably incorrect memory access or stack overflow)
    입니다. 2차원 배열을 사용한것 외에는 포인터관련 연산을 하지 않았는데 어느부분이 문제가 되서 런타임 에러가 발생하는지 잘 모르겠습니다;

    100 x 100 크기의 int형 2차원 배열, 격자의 크기 wide가 전역변수로 선언되어있고 scanf로 각각 내용을 입력받습니다.

    #include <utility>
    
    #include <stdio.h>
    
    #include <string>
    
    #include <map>
    
    #include <algorithm>
    
    #include <vector>
    
    using namespace std;
    
    // 현위치로부터 보드에 도달할 수 있는지 없는지를 확인해주는 canReach
    bool canReach(int y, int x);
    
    // 현위치가 유효한 보드범위 내 위치인지 확인하는 isRight
    bool isRight(int y, int x);
    
    // 격자를 모두 -1로 초기화해준다.
    void initiateBoard(void);
    
    // 전역변수
    int board[100][100];        // 격자
    int wide = 0;               // 격자의 크기
    
    int main(void) {
    
        int C = 0;              // case의 수
    
        // case 수를 입력받음
        scanf("%d", &C);        
    
        // case 만큼 수행
        while( C-- ) {
    
            // 격자를 초기화
            initiateBoard();
    
            // 격자의 크기를 입력받음
            scanf("%d", &wide);
    
            // 격자정보를 입력받음
            for( int i = 0; i < wide; i++ ) {
                for( int j = 0; j < wide; j++ ) {
                    scanf("%d", &(board[i][j]));
                }
            }
    
            // 경로존재 여부에따른 결과 출력
            if( canReach(0, 0) )
                printf("YES\n");
            else
                printf("NO\n");
        }
    
        return 0;
    }
    
    bool canReach(int y, int x) {
        bool flag = false;      // =|연산을 위한 flag
    
        // 기저사례1 - 현재 격자위치가 끝지점( board[y][x] == 0 )에 도달, true반환
        if( board[y][x] == 0 )
            return true;
        // 기저사례2 - 현재 격자위치가 유효하지 않은 board 범위에 도달, (영역초과) -> isRight
        else if( !isRight(y, x) )
            return false;
    
        else {
        // 재귀호출
        // 1. 현재위치y,x에서 board[y][x]만큼 오른쪽으로
            flag |= canReach(y, x+board[y][x]);
        // 2. 현재위치y,x에서 board[y][x]만큼 아래쪽으로
            flag |= canReach(y+board[y][x], x);
    
            return flag;
        }
    }
    
    bool isRight(int y, int x) {
        // y, x의 값이 wide 보다 크거나 같으면 잘못된 위치 -> false 반환
        if( (y >= wide) || (x >= wide) )
            return false;
        else
            return true;
    }
    
    void initiateBoard(void) {
        // 격자를 모두 -1로 초기화
        for( int i = 0; i < 100; i++) {
            for( int j = 0; j < 100; j++ ) {
                board[i][j] = -1;
            }
        }
    }
    

    10년 전
2개의 댓글이 있습니다.
  • Being
    Being

    힌트: 기저 사례 두 가지 사이의 문제입니다.


    10년 전 link
  • kim08277
    kim08277

    아....! 감사합니다!


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