八皇后C++利用堆栈回溯

Eight Queens C++ utilizing a Stack Backtracking

本文关键字:堆栈 回溯 C++      更新时间:2023-10-16

所以我这样做是为了家庭作业,我无法弄清楚我的错误在哪里。 任何帮助将不胜感激。

我的理解是这样的。

  1. 初始化一个堆栈以跟踪哪一行和哪一列中有女王。
  2. 在第一个方格上放置一个女王,将其位置推到堆栈上。 推 (0,0(;然后设置该行已填充的变量。 填充+;

3.然后循环

检查当前行或列是否与其他女王冲突。

A. 无冲突。 推送到堆栈。增加填充行变量。 填充++; 上移一排。

b. 存在冲突。 向右移动。col++;

c.不能再向右移动了。 弹出堆栈并设置为行和列减去填充。然后搬过去。col++;然后重试。


int main(){

bool board[8][8];
for(int i = 0; i < 8; i++){
    for(int j = 0; j < 8; j++){
        board[i][j] = false;}}
int row = 0, col = 0, filled = 0;
StackLi<int> rowStack;
StackLi<int> colStack;
rowStack.push(row);
colStack.push(col);
board[row][col] = true;
//cout << "push: " << "(" << row << "," << col << ")" << endl;  
row++;

while(filled < 7)
{
    if(!isSafe(board,row,col) )
        {
        filled++;
        rowStack.push(row);
        colStack.push(col);
        board[row][col] = true;
    //cout << "push: " << "(" << row << "," << col << ")" << endl;  
        if(filled > 8)
            {
            print(board);
            return 0;
            }
        row++;
    }
    else{
col++;
    //cout << "move: " << "(" << row << "," << col << ")" << endl;  
    }
    if(col > 7)
{
       row = rowStack.topAndPop();
       col = colStack.topAndPop();
   board[row][col] = false;
       cout << "pop: " << "(" << row << "," << col << ")" << endl;  
   filled--;
}
}
return 0;
}
bool isSafe(bool board[8][8], int row, int col)
{

for(int i = 0; i < 8; i++)
{
    if(board[row][i] || board[i][col]) return true;
}
for(int i = 0; (row - i)>=0 && (col-i) >= 0; i++)
{
    if(board[row-i][col-i]) return true;
}
for(int i = 0; (row - i)<=8 && (col-i) >= 0; i++)
{
    if(board[row+i][col+i]) return true;
}
return false;
}
#include <iostream>
using namespace std;
class Node {
public:
    int data;
    Node* next;
    Node()
    {
        data = 0;
        next = NULL;
    }
};
class Stack {
    Node* top;
public:
    Stack()
    {
        top = NULL;
    }
    bool is_empty()
    {
        if (top == NULL)
            return true;
        else
            return false;
    }
    void push(int item)
    {
        Node* new_node = new Node();
        new_node->data = item;
        if (is_empty())
        {
            new_node->next = NULL;
            top = new_node;
        }
        else {
            new_node->next = top;
            top = new_node;
        }
    }
    int pop() {
        int value;
        Node* delet_ptr = top;
        value = top->data;
        top = top->next;
        delete delet_ptr;
        return value;
    }
    };
bool isSafe(bool board[8][8], int row, int col)
{
    for (int i = 0; i < 8; i++)
    {
        if (board[row][i] || board[i][col]) {return true;}
    }
    for (int r = row, c = col; r < 8 && c >=0; r++,c--)
    {
        if (board[r][c]) {return true;}
    }
    for (int r = row, c = col; r < 8 && c < 8; r++,c++)
    {
        if (board[r][c]) {return true;}
    }
    for (int r = row, c = col; r >= 0 && c >= 0; r--,c--)
    {
        if (board[r][c]) {return true;}
    }
    for (int r = row, c = col; r >= 0 && c < 8; r--,c++)
    {
        if (board[r][c]) {return true;}
    }
    return false;
}
    int main() {
        bool board[8][8];
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                board[i][j] = false;
            }
        }
        int row = 0, col = 0, filled = 0;
        Stack rowStack, colStack;
        rowStack.push(row);
        colStack.push(col);
        board[row][col] = true;
        cout << "push: " << "(" << row << " , " << col << ")n" << endl;  
        row++;

        while (filled < 7)
        {
            if (!isSafe(board, row, col))
            {
                filled++;
                rowStack.push(row);
                colStack.push(col);
                board[row][col] = true;
                cout << "push: " << "(" << row << " , " << col << ")" << endl;  
                row++;
                col=0;
            }else {
                col++;
                cout << "move: " << "(" << row << " , " << col << ")" << endl;
                if (col > 7) {
                    row = rowStack.pop();
                    col = colStack.pop();
                    board[row][col] = false;
                    cout << "pop: " << "(" << row << " , " << col << ")" << endl;
                    col++;
                    filled--;
                }
            }
        }
        system("pause");
        return 0;
    }