八皇后C++利用堆栈回溯
Eight Queens C++ utilizing a Stack Backtracking
所以我这样做是为了家庭作业,我无法弄清楚我的错误在哪里。 任何帮助将不胜感激。
我的理解是这样的。
- 初始化一个堆栈以跟踪哪一行和哪一列中有女王。
- 在第一个方格上放置一个女王,将其位置推到堆栈上。 推 (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;
}
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 回溯C++不打印函数,因此文件
- 算法问题:查找从堆栈中弹出的所有序列
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 为什么调用堆栈数组会导致内存泄漏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- 堆栈和队列是否像C++中的数组一样传递?
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 我正在尝试使用回溯来解决 N queen 问题,但在编译时它会给出运行时错误(动态堆栈缓冲区溢出)
- 在 C++/STL/MFC 应用程序启动早期发生的致命异常中,是否可以信任堆栈回溯符号名称?
- 如何展开堆栈以获取指定堆栈指针(SP)的回溯
- 用于回溯迷宫的堆栈
- gdb回溯没有显示main()的完整堆栈跟踪
- 八皇后C++利用堆栈回溯
- 在展开堆栈之前获取回溯
- 来自回溯的堆栈跟踪未显示导致多线程环境下崩溃的方法