2015-04-02 90 views
0

我继续得到这个奇怪的错误,它正在打印我的解决方案不正确。我相信它与printSolution()方法有关,因为它打印出“Q Q * Q Q Q Q Q”(尽管这是不正确的),然后我得到了分段错误错误。新来的c + +得到一个奇怪的分段错误错误

这里是我的.cpp

#include "NQueens.h" 
#include<iostream> 

using namespace std; 

NQueens::NQueens() 
{ 

} 

NQueens::~NQueens() 
{ 
    cout <<"Destroying an object"<<endl; 
} 


void NQueens::printBoard(int board[], int N) 
{ 
    std::cout<<endl; 
    for(int i = 0; i<N; i++) 
    { 
     int chessBoard[N]; 
     chessBoard[board[i]] = 1; 
     for(int j =0; j<N; j++) 
     { 
      if(chessBoard[j]==0) 
      std::cout<<"* "; 
      else 
      std::cout<<"Q "; 
     } 
    std::cout<<endl; 
    } 
} 

bool NQueens::safePlace(int row, int col, int board[]) 
{ 
    for(int i = 0; i<row; i++) 
    { 
     if((board[i] == col) || (i-row)==(board[i]-col) || (i-row) == (col-board[i])) 
     return false; 
    } 
    return true; 
} 

void NQueens::solve(int N) 
{ 
    int board[N]; 
    int row = 0; 
    while(row<N && row>-1) 
    { 
// condition that the row is occupied and the queen is safe to place 
     if(board[row]>-1 && board[row]<(N-1)) 
     { 
      for(int i = board[row]+1; i<N; i++) 
      { 
       //checks for safety 
       if(safePlace(row, i, board)) 
       { 
        board[row]=i; 
        ++row; 
        break; 
       } 
       else if(i==(N-1)) 
       { 
        board[row]=-1; 
        --row; 
       } 
      } 
     } 
     else if(board[row]==-1 && board[row]<(N-1)) 
     { 
      for(int i = 0; i<N;i++) 
      { 
       if(safePlace(row, i, board)) 
       { 
        board[row]=i; 
        ++row; 
        break; 
       } 
       else if(i==(N-1)) 
       { 
        board[row]=-1; 
        --row; 
       } 
      } 
     } 
     else 
     { 
      board[row]=-1; 
      --row; 
     } 
    } 
    printBoard(board,N); 
} 

int main() 
{ 
    NQueens driver; 
    driver.solve(8); 

    return 0; 
} 

难道这是因为循环语句达到零?

+0

我看到的一个问题是,您正在使用'i'在'for'循环的每个循环中初始化一个新的'chessBoard [N]'。 – DigitalNinja 2015-04-02 00:54:30

+3

这不是标准的C++:'int chessBoard [N];'必须使用常量表达式来声明C++中的数组,而不是一个变量。 – PaulMcKenzie 2015-04-02 00:56:16

回答

0

我没有看到solve()在使用之前初始化board的内容。

因此,对safePlace()的调用将board数组初始化为垃圾值,从而触发段错误。

+0

就是这样!谢谢@Sam Varshavchik我在初始化变量时非常可怕,我想训练自己去做那个笑,再次感谢你。 – spstephens 2015-04-02 01:01:39