Итак, я работаю над проблемой N-Queens в C ++, которая требует от меня использования стеков для обратного отслеживания.Пока у меня есть код, показанный ниже, и он, кажется, застрял в бесконечном цикле.Значения продолжают застревать в: row: 4 col: 7 col: 8 заполнено: 3 По сути, все символы ферзя, обозначенные «1» в массиве доски, должны быть размещены так, чтобы не было конфликтов (любая ферзя может двигаться по диагонали илигоризонтально, не сталкиваясь с другой королевой).Может кто-нибудь помочь мне понять, что вызывает его зависание?Извините, если мне не хватает какой-либо информации, это мой первый пост здесь.
* edit1: зависание происходит, когда доска выглядит так, как показано ниже.Таким образом, основная проблема заключается в том, что 4-я королева ставится при попытке установить 5-ю.
1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
#include <iostream>
#include <stack>
using namespace std;
bool isSafe(int board[8][8], int row, int col);
int main(){
int board[8][8];
for(int i = 0; i < 8; i++){
for(int j = 0; j < 8; j++){
board[i][j] = 0;
}
}
int row = 0, col = 0, filled = 0;
stack <int> rowStack;
stack <int> colStack;
rowStack.push(row);
colStack.push(col);
board[row][col] = 1;
row++;
while(filled < 7){
if(isSafe(board,row,col)){
//if the position is safe, place a queen at row, col and push them to each stack
filled++;
rowStack.push(row);
colStack.push(col);
board[row][col] = 1;
//if board has all queens placed on it, print the contents
if(filled > 8){
for(int i=0; i<row; i++){
for(int j=0; j<col; j++){
cout<<board[i][j]<<" ";
cout<<endl;
}
}
return 0;
}
cout<<"Filled: "<<filled<<endl;
row++;
cout<<"Row: "<<row<<endl;
}
else{
col++;
cout<<"Column: "<<col<<endl;
}
if(col > 7){
row = rowStack.top();
rowStack.pop();
col = colStack.top();
colStack.pop();
board[row][col] = 0; //backtracking step
filled--;
}
}
return 0;
}
bool isSafe(int board[8][8], int row, int col){
for(int i = 0; i < 8; i++){
if(board[row][i]==1 || board[i][col]==1)
return false;
}
for(int i = 0; (row - i)>=0 && (col-i) >= 0; i++){
if(board[row-i][col-i]==1)
return false;
}
for(int i = 0; (row - i)<=8 && (col-i) >= 0; i++){
if(board[row+i][col+i]==1)
return false;
}
return true;
}