C++ 未获得N-Queens问题的预期输出

C++ 未获得N-Queens问题的预期输出,c++,backtracking,n-queens,C++,Backtracking,N Queens,我正在编写臭名昭著的N皇后问题的代码。但我有个问题。程序正在执行,但没有按预期输出,因为我遇到了一个问题,因为矩阵板值没有更改,并且第一个值分配给板,即0分配给板的每个元素。逻辑错误可能是什么 这是密码 #include<iostream> using namespace std; int board[4][4]; int isAttacked(int i, int j){ for(int k = 0; k < 4; k++){ if(board[i][

我正在编写臭名昭著的N皇后问题的代码。但我有个问题。程序正在执行,但没有按预期输出,因为我遇到了一个问题,因为矩阵
值没有更改,并且第一个值分配给
,即
0
分配给
的每个元素。逻辑错误可能是什么

这是密码

#include<iostream>
using namespace std;
int board[4][4];
int isAttacked(int i, int j){
    for(int k = 0; k < 4; k++){
        if(board[i][k] == 1 || board[k][j] == 1) return true; // checking for the rows and columns 
    }
    for(int k = 0; k < 4; k++){
        for(int l = 0; l < 4; l++){
            if(((k + l) == (i + j))|| ((k - l) == (i - j))){   // checking for the diagonals 
                if(board[k][l] == 1) return true;
            }
        }
    }
    return false;
}
int nQueen(int N){
    if(N == 0) return true;
    for(int i = 0; i < 4; i++){
        for(int j = 0; j < 4; j++){
            if(!isAttacked(i, j)){ 
                board[i][j] == 1;
                if(nQueen(N - 1))
                    return true;
                board[i][j] = 0;
            }
        }
    }
    return false;
}
void print(){    
    for(int i = 0; i < 4; i++){
        for(int j = 0; j < 4; j++){
            cout << board[i][j];
        }
        cout << "\n"; 
    }
}
int main(){
    for(int i = 0; i < 4; i++){
        for(int j = 0; j < 4; j++){
            board[i][j] = 0;
        }
    }
    nQueen(4);
    print();
    return 0;
}
实际o/p:

0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0

因此,我调试了我的代码,这是一个愚蠢的错误:(错误是在
nQueen()中使用
==
操作符而不是
=
操作符。 应该是

for(int j = 0; j < 4; j++){
            if(!isAttacked(i, j) && (board[i][j] != 1)){ 
                *board[i][j] = 1;*
                if(nQueen(N - 1))
                    return true;
for(int j=0;j<4;j++){
如果(!isAttacked(i,j)&(board[i][j]!=1)){
*董事会[i][j]=1*
if(nQueen(N-1))
返回true;
而不是

for(int j = 0; j < 4; j++){
            if(!isAttacked(i, j) && (board[i][j] != 1)){ 
                *board[i][j] == 1;*
                if(nQueen(N - 1))
                    return true;
for(int j=0;j<4;j++){
如果(!isAttacked(i,j)&(board[i][j]!=1)){
*板[i][j]==1*
if(nQueen(N-1))
返回true;
下面是调试过的代码

#include<iostream>
using namespace std;
int board[4][4];
int isAttacked(int i, int j){
    for(int k = 0; k < 4; k++){
        if(board[i][k] == 1 || board[k][j] == 1) return 1; // checking for the rows and columns 
    }
    for(int k = 0; k < 4; k++){
        for(int l = 0; l < 4; l++){
            if(((k + l) == (i + j)) || ((k - l) == (i - j))){   // checking for the diagonals 
                if(board[k][l] == 1) 
                return 1;
            }
        }
    }
    return 0;
}
bool nQueen(int N){
    if(N == 0) return true;
    for(int i = 0; i < 4; i++){
        for(int j = 0; j < 4; j++){
            if(!isAttacked(i, j) && (board[i][j] != 1)){ 
                board[i][j] = 1;
                if(nQueen(N - 1))
                    return true;
                board[i][j] = 0;
            }
        }
    }
    return false;
}
void print(){    
    for(int i = 0; i < 4; i++){
        for(int j = 0; j < 4; j++){
            cout << board[i][j];
        }
        cout << "\n"; 
    }
}
int main(){
    nQueen(4);
    print();
    return 0;
}
#包括
使用名称空间std;
国际板[4][4];
int isAttacked(int i,int j){
对于(int k=0;k<4;k++){
if(board[i][k]==1 | | board[k][j]==1)返回1;//检查行和列
}
对于(int k=0;k<4;k++){
对于(int l=0;l<4;l++){
如果((k+l)=(i+j))| |((k-l)==(i-j)){//检查对角线
如果(线路板[k][l]==1)
返回1;
}
}
}
返回0;
}
布尔恩琴(国际北){
如果(N==0),则返回true;
对于(int i=0;i<4;i++){
对于(int j=0;j<4;j++){
如果(!isAttacked(i,j)&(board[i][j]!=1)){
董事会[i][j]=1;
if(nQueen(N-1))
返回true;
板[i][j]=0;
}
}
}
返回false;
}
无效打印(){
对于(int i=0;i<4;i++){
对于(int j=0;j<4;j++){

所以,我调试了我的代码,这是一个愚蠢的错误:(错误是使用
=
操作符,而不是
=
操作符
nQueen()
)。 应该是

for(int j = 0; j < 4; j++){
            if(!isAttacked(i, j) && (board[i][j] != 1)){ 
                *board[i][j] = 1;*
                if(nQueen(N - 1))
                    return true;
for(int j=0;j<4;j++){
如果(!isAttacked(i,j)&(board[i][j]!=1)){
*董事会[i][j]=1*
if(nQueen(N-1))
返回true;
而不是

for(int j = 0; j < 4; j++){
            if(!isAttacked(i, j) && (board[i][j] != 1)){ 
                *board[i][j] == 1;*
                if(nQueen(N - 1))
                    return true;
for(int j=0;j<4;j++){
如果(!isAttacked(i,j)&(board[i][j]!=1)){
*板[i][j]==1*
if(nQueen(N-1))
返回true;
下面是调试过的代码

#include<iostream>
using namespace std;
int board[4][4];
int isAttacked(int i, int j){
    for(int k = 0; k < 4; k++){
        if(board[i][k] == 1 || board[k][j] == 1) return 1; // checking for the rows and columns 
    }
    for(int k = 0; k < 4; k++){
        for(int l = 0; l < 4; l++){
            if(((k + l) == (i + j)) || ((k - l) == (i - j))){   // checking for the diagonals 
                if(board[k][l] == 1) 
                return 1;
            }
        }
    }
    return 0;
}
bool nQueen(int N){
    if(N == 0) return true;
    for(int i = 0; i < 4; i++){
        for(int j = 0; j < 4; j++){
            if(!isAttacked(i, j) && (board[i][j] != 1)){ 
                board[i][j] = 1;
                if(nQueen(N - 1))
                    return true;
                board[i][j] = 0;
            }
        }
    }
    return false;
}
void print(){    
    for(int i = 0; i < 4; i++){
        for(int j = 0; j < 4; j++){
            cout << board[i][j];
        }
        cout << "\n"; 
    }
}
int main(){
    nQueen(4);
    print();
    return 0;
}
#包括
使用名称空间std;
国际板[4][4];
int isAttacked(int i,int j){
对于(int k=0;k<4;k++){
if(board[i][k]==1 | | board[k][j]==1)返回1;//检查行和列
}
对于(int k=0;k<4;k++){
对于(int l=0;l<4;l++){
如果((k+l)=(i+j))| |((k-l)==(i-j)){//检查对角线
如果(线路板[k][l]==1)
返回1;
}
}
}
返回0;
}
布尔恩琴(国际北){
如果(N==0),则返回true;
对于(int i=0;i<4;i++){
对于(int j=0;j<4;j++){
如果(!isAttacked(i,j)&(board[i][j]!=1)){
董事会[i][j]=1;
if(nQueen(N-1))
返回true;
板[i][j]=0;
}
}
}
返回false;
}
无效打印(){
对于(int i=0;i<4;i++){
对于(int j=0;j<4;j++){

这可能与您的问题无关,但是您知道
true
false
属于
bool
类型,而不是
int
?因为
board
是全局的,条目已经初始化为0。因此编写一个初始化循环在将元素初始化为0方面没有任何作用。另外,请远离from一个字母的变量名,如
l
1
在视觉上看起来是一样的,这使得调试变得更加困难。@Someprogrammerdude是的!有点忘记了!@PaulMcKenzie我应该怎么做才能克服这个问题?你应该使用一个调试器,在代码中逐行逐行执行,看看代码与你期望的有何偏差。a除非您(通过使用调试器)做出了努力,否则“可能是什么逻辑错误?”之类的屏蔽问题在这里不会被看得太高确定问题在代码中的位置。如何解决问题是一个不同的问题,但您应该首先确定问题的位置。与您的问题无关,但您知道
true
false
属于
bool
类型,而不是
int
,因为
board
是全局性的,条目已初始化为0。因此,编写一个循环来初始化实际上并不能将元素初始化为0。此外,请远离一个字母的变量名,因为
l
1
在视觉上看起来是一样的,这使得调试变得更加困难。@Someprogrammerdude-yup!有点忘了它!@PaulMcKenzie-wh我应该怎么做才能克服这个问题?你应该使用一个调试器,在代码中一行一行地逐行执行,看看代码偏离了你的预期。除非你(通过使用调试器)表现出努力,否则在这里不会太重视问问题,比如“可能是什么逻辑错误?”确定问题在代码中的位置。如何解决问题是另一个问题,但您应该首先确定问题所在。