Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的N-Queens程序在filled=3、row=4和col=7/8时挂起? 我正在研究C++中的N-Quess问题,这需要我使用栈来进行回溯。到目前为止,我的代码如下所示,它似乎陷入了一个无限循环。这些值一直停留在以下位置: 第4排 上校:7 上校:8 填充:3 基本上,棋盘阵列中以“1”表示的所有皇后字符都必须放置在没有冲突的位置(任何皇后都可以沿对角线或水平方向移动,而不会碰到另一个皇后)。 有人能帮我找出是什么导致它挂起来的吗?对不起,如果我遗漏了任何信息,这是我在这里的第一篇帖子_C++_Stack_N Queens - Fatal编程技术网

为什么我的N-Queens程序在filled=3、row=4和col=7/8时挂起? 我正在研究C++中的N-Quess问题,这需要我使用栈来进行回溯。到目前为止,我的代码如下所示,它似乎陷入了一个无限循环。这些值一直停留在以下位置: 第4排 上校:7 上校:8 填充:3 基本上,棋盘阵列中以“1”表示的所有皇后字符都必须放置在没有冲突的位置(任何皇后都可以沿对角线或水平方向移动,而不会碰到另一个皇后)。 有人能帮我找出是什么导致它挂起来的吗?对不起,如果我遗漏了任何信息,这是我在这里的第一篇帖子

为什么我的N-Queens程序在filled=3、row=4和col=7/8时挂起? 我正在研究C++中的N-Quess问题,这需要我使用栈来进行回溯。到目前为止,我的代码如下所示,它似乎陷入了一个无限循环。这些值一直停留在以下位置: 第4排 上校:7 上校:8 填充:3 基本上,棋盘阵列中以“1”表示的所有皇后字符都必须放置在没有冲突的位置(任何皇后都可以沿对角线或水平方向移动,而不会碰到另一个皇后)。 有人能帮我找出是什么导致它挂起来的吗?对不起,如果我遗漏了任何信息,这是我在这里的第一篇帖子,c++,stack,n-queens,C++,Stack,N Queens,*edit1:当板子看起来像下面的板子时,就会发生挂起行为。所以主要的问题是在第四个皇后被放置之后,当试图放置第五个皇后时 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 #包括 #包括 使用名称空间std; 布尔伊萨菲(国际板[8][8],国际行,国际列);

*edit1:当板子看起来像下面的板子时,就会发生挂起行为。所以主要的问题是在第四个皇后被放置之后,当试图放置第五个皇后时

 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 
#包括
#包括
使用名称空间std;
布尔伊萨菲(国际板[8][8],国际行,国际列);
int main(){
国际板[8][8];
对于(int i=0;i<8;i++){
对于(int j=0;j<8;j++){
板[i][j]=0;
}
}
int行=0,列=0,填充=0;
堆栈行堆栈;
堆栈colStack;
rowStack.push(行);
colStack.push(col);
板[行][列]=1;
行++;
while(填充<7){
if(isSafe(板、行、列)){
//如果位置安全,则在row、col处放置一个皇后,并将其推到每个堆栈上
填充++;
rowStack.push(行);
colStack.push(col);
板[行][列]=1;
//如果黑板上有所有的皇后,打印内容
如果(填充>8){

对于(inti=0;i,我将再次重申,调试多行代码开始超出stackoverflow的范围

放置皇后时,Col不会重置,因此忽略行中前面的潜在有效正方形


还有其他的错误,还有一些可以改进的地方。例如,你可能更喜欢memset你的2d数组,而不是迭代和每个索引,并做很多不必要的数学运算。

嘿,chip,通常最好有一个非常小的堆栈溢出示例,而不一定要寻找整体的“为什么它不工作?”.你的文章将从缩小问题的确切范围中获益。如果你解释“挂起”的原因也会有所帮助行为。我还将提到,您可能希望使用codereview.stackexchange.com获得一般反馈。提示:在每次移动时或在移动发生崩溃之前打印板。在回溯步骤中,如果(col>7){…}
,您将转到最后一个皇后的位置并将其移除。但是,您的
将在(填充<7)时打印{ ... }
循环将重新启动,并将皇后放在完全相同的位置。如果你反复做相同的事情,回溯不起作用-你需要做一些不同的事情。我相信堆栈溢出的范围只是你放在它上面的一个范围。它是一个问问题以获得潜在答案的地方,不管答案有多小或多明显。因此e不能是行中前面的有效方块,因为两个皇后不能在同一行中。这就是我最初解释的冲突。当然,还有一些地方可以改进,因为这是我尝试过的暴力实现。它不应该被优化;我现在只是想让它工作。堆栈溢出ow有一些关于提问的指导/建议,您可以在这里找到。另外,我要说的是,这一行前面可以有有效的方框。例如,在粘贴的输出中,您可以看到一个这样的示例。第5行的第3列是一个“安全”的地方对于女王来说,但您的实现已经超越了这一列,并且没有过程来检查这是否是一个有效的位置。我也不建议您修改解决方案以使其更优化。在指导您进行代码审查时,我只是指出关注代码质量、设计原则和es.CR.SE是一个庞大的个人网络,定期进行行业质量审查。
#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;
}