RTE (SIGABRT: program aborted, probably assertion fail)가 뜹니다 ㅠ

  • Freean2468
    Freean2468

    문제 URL : http://algospot.com/judge/problem/read/NQUEEN

    N-Queen 문제를 풀고 채점을 시도했는데 자꾸만 위의 에러가 뜨네요;

    직접 돌려 보면 정상적으로 실행이 됩니다.

    도저히 어떻게 해결해야 될지 모르겠네요.

    왜 이 에러가 뜨는 건가요??

    #include <iostream>
    
    using std::cin;
    using std::cout;
    using std::endl;
    using std::bad_alloc;
    
    typedef enum {QUEEN, ABLE, NOTABLE} STATE;
    
    class Board{
    private:
      STATE* m_board;
      int m_size;
      int m_result;
    
    public:
      Board(int _size):m_size(_size), m_result(0){
        try{
          m_board = new STATE[m_size*m_size];
        }
        catch(bad_alloc e){
          e.what();
        }
      }
      ~Board(){
        delete[] m_board;
      }
    
      void initBoard(STATE* _board){
        for(int i = 0; i < m_size*m_size; i++){
          _board[i] = ABLE;
        }
      }
    
      void process(){
        for(int k = 0; k < m_size; k++){
          int depth=0;
          initBoard(m_board);
          if(m_board[k] == ABLE)
            calc(m_board, k, depth);
        }
    
        cout << m_result << endl;
      }
    
      void calc(STATE* _parent, int _pos, int &_depth){
        try{
          STATE* board = new STATE[m_size*m_size];
          int depth = _depth;
          depth++;
    
          for(int i = 0; i < m_size*m_size; i++){
            board[i] = _parent[i];
          }
    
          setQueen(board, _pos);
    
          for(int i = m_size*depth; i < m_size*(depth+1); i++){  
            if(board[i] == ABLE){
              calc(board, i, depth);
            }
          }
    
          if(countQueen(board))
            m_result++;
    
          delete[] board;
        }
        catch(bad_alloc e){
          e.what();
        }
      }
    
      void setQueen(STATE* _board, int _pos){
        int height = _pos/m_size;
        int width = _pos%m_size;
    
        _board[(height*m_size)+width]=QUEEN;
    
        //right
        for(int j = width+1; j < m_size; j++){
          _board[(height*m_size)+j] = NOTABLE;
        }
        //left
        for(int j = width-1; j >= 0; j--){
          _board[(height*m_size)+j] = NOTABLE;
        }
        // bottom
        for(int j = height+1; j < m_size; j++){
          _board[(j*m_size)+width] = NOTABLE;
        }
        // top
        for(int j = height-1; j >= 0; j--){
          _board[(j*m_size)+width] = NOTABLE;
        }
        // botleft
        for(int i = height+1, j = width-1; i < m_size; i++, j--){
          if(j < 0)
            break;
          _board[(i*m_size)+j] = NOTABLE;
        }
        // botright
        for(int i = height+1, j = width+1; i < m_size; i++, j++){
          if(j >= m_size)
            break;
          _board[(i*m_size)+j] = NOTABLE;
        }
        // topright
        for(int i = height-1, j = width+1; i >= 0; i--, j++){
          if(j >= m_size)
            break;
          _board[(i*m_size)+j] = NOTABLE;
        }
        // topleft
        for(int i = height-1, j = width-1; i >= 0; i--, j--){
          if(j < 0)
            break;
          _board[(i*m_size)+j] = NOTABLE;
        }
      }
    
      bool countQueen(STATE* _board){
        int count=0;
    
        for(int i = 0; i < m_size; i++){
          for(int j = 0; j < m_size; j++){
            if(_board[(i*m_size)+j] == QUEEN)
              count++;
          }
        }
    
        if(count == m_size)
          return true;
        else 
          return false;
      }
    };
    
    int main(){
      int test=0;
    
      cin >> test;
    
      while(test--){
        int size=0;
    
        cin >> size;
    
        Board board(size);
    
        board.process();
      }
    
      return 0;
    }
    

    12년 전
5개의 댓글이 있습니다.
  • hyunhwan
    hyunhwan

    개인 서버에서 돌려본 결과 다음과 같이 입력을 넣게 될 경우에 문제가 발생하는 것 같습니다.

    6
    1
    2
    3
    4
    5
    6
    

    12년 전 link
  • Freean2468
    Freean2468

    저는 아무런 문제도 발생하지 않습니다 ㅠ


    12년 전 link
  • JongMan
    JongMan

    메모리 문제는 돌리는 환경에 따라서 안 잡히고 넘어가기도 합니다. 제가 확인한 리눅스 환경에서는 다음과 같은 에러가 납니다.

    *** glibc detected *** ./a.out: double free or corruption (!prev): 0x0000000002e62d30 ***
    ======= Backtrace: =========
    /lib64/libc.so.6[0x2ba8fc97b30f]
    /lib64/libc.so.6(cfree+0x4b)[0x2ba8fc97b76b]
    ./a.out[0x401220]
    ./a.out[0x4011d5]
    ./a.out[0x4011d5]
    ./a.out[0x4011d5]
    ./a.out[0x4011d5]
    ./a.out[0x4011d5]
    ./a.out[0x4011d5]
    ./a.out[0x4011d5]
    ./a.out[0x4011d5]
    ./a.out[0x4011d5]
    ./a.out[0x4012ca]
    ./a.out(__gxx_personality_v0+0x1b6)[0x400c9e]
    /lib64/libc.so.6(__libc_start_main+0xf4)[0x2ba8fc926994]
    ./a.out(__gxx_personality_v0+0x51)[0x400b39]
    .. (생략) ..
    

    12년 전 link
  • Toivoa
    Toivoa

    얼핏 보니 calc에서 _depth가 m_size - 1일 때 depth = m_size가 되어서 setQueen 직후 for 문에서 메모리 침범이 날 것처럼 생겼네요


    12년 전 link
  • Freean2468
    Freean2468

    아....감사합니다. Toivoa님 말씀이 맞네요. 오로지 제 실수로군요 ㅠㅠ


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