首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未获得N-Queens问题的预期输出

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

Stack Overflow用户
提问于 2019-09-14 21:04:32
回答 1查看 74关注 0票数 1

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

以下是代码

代码语言:javascript
复制
#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应为:

代码语言:javascript
复制
0 1 0 0
0 0 0 1
1 0 0 0
0 0 1 0

实际o/p:

代码语言:javascript
复制
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
EN

回答 1

Stack Overflow用户

发布于 2019-09-19 20:22:35

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

代码语言:javascript
复制
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;

而不是

代码语言:javascript
复制
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;

以下是经过调试的代码。

代码语言:javascript
复制
#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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57935773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档