Почему моя программа N-Queens зависает при заполнении = 3, строке = 4 и столбце = 7/8? - PullRequest
0 голосов
/ 25 сентября 2019

Итак, я работаю над проблемой 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;
}

1 Ответ

0 голосов
/ 25 сентября 2019

Я еще раз повторю, что отладка более чем одной строки кода начинает выходить за пределы области действия для стекового потока.

Col не сбрасывается, когда вы помещаете ферзь, поэтому вы игнорируете потенциальные действительные квадраты ранеев ряд.

Есть также другие ошибки и некоторые детали, которые можно улучшить.Например, вы можете предпочесть memset свой 2d массив, а не итерацию и каждый индекс и делать много ненужной математики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...