C++ 未获得N-Queens问题的预期输出
我正在编写臭名昭著的N皇后问题的代码。但我有个问题。程序正在执行,但没有按预期输出,因为我遇到了一个问题,因为矩阵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][
板
值没有更改,并且第一个值分配给板
,即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我应该怎么做才能克服这个问题?你应该使用一个调试器,在代码中一行一行地逐行执行,看看代码偏离了你的预期。除非你(通过使用调试器)表现出努力,否则在这里不会太重视问问题,比如“可能是什么逻辑错误?”确定问题在代码中的位置。如何解决问题是另一个问题,但您应该首先确定问题所在。