我继续收到这个奇怪的错误,它错误地打印了我的解决方案。我认为这与printSolution()
方法有关,因为它是打印"Q Q*Q Q Q Q"(尽管这是不正确的),然后我得到了一个分割错误。
这是我的.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;
}
这可能是因为循环语句达到null吗?
我不知道solve()
在使用之前在哪里初始化board
的内容。
因此,对safePlace()
的调用传递初始化为垃圾值的board
数组,从而触发segfault。