这是我第一次在这里发布问题,所以请放轻松。
我最近遇到了 n-queen / 8 queen 问题,发现它很有趣,可以尝试一下
我为这个问题做了一个基本的代码,但它没有给出任何输出。当我尝试调试它时,它显示流程没有超出某个点,并且会返回到它的父函数进行进一步的迭代。
因此,在花了一些时间之后,我似乎无法理解问题所在,因此决定寻求帮助。
另外,似乎我需要在函数头中为 2-D /3-D 数组定义数组的大小等等.....
PS我是学生,所以我可能会弄错一些概念。对不起,如果他们中的一些人太愚蠢了。
这是代码:
//------------------------------------------------------------------------
#include<iostream>
#include<conio.h>
#include<stdlib.h>
using namespace std;
#define RED -1
#define BLACK 0
#define OCCUPIED 1
//RED = Cell attackable by queen(s)
//BLACK = Cell safe from attack and hence a piece may be placed there
//OCCUPIED = Cell where a queen resides
void display(int,int[20][20]);
void nqueen(int,int[20][20],int=0);
int main()
{
//clrscr();
int n,board[20][20];
cout<<"Enter value of n:";
cin>>n;
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)
board[i][j]=BLACK; //Initializing the board to black
nqueen(n,board); //Calling function
return 0;
}
void display(int n,int board[20][20]) //Gives an error if i dont define size of board
{
for(int i=0;i<n;++i)
{
for(int j=0;j<n;++j)
if(board[i][j]==OCCUPIED)
cout<<"O";
else
cout<<"X";
cout<<endl;
}
cout<<"\nPress 0 to exit...."; //Allows the program ot be terminated mid-way
int ch;
cin>>ch;
if(ch==0)
exit(1);
//clrscr();
}
//Displays all the boards contents O = Occupied while X = Not occupied
void nqueen(int n,int board[20][20],int row) //row is given a default value 0
{
if(row==n) //End Statement
{
display(n,board);
return;
}
for(int i=0;i<n;++i) //Looping within row's columns to check for BLACK cells
if(board[row][i]==BLACK) //condition
{
//-------Puts attack (RED) on the board------
for(int j=0;j<n;++j)
board[j][i]=RED; //all cells in column turned red . Not done for row so as to allow further ilteation .
for(int k=0;(k+row)<n&&(k+i)<n;++k)
board[row+k][i+k]=RED; //This reds out the diagonal right cells. Left upper rows unaltered as its too much of a useless bother
for(int k=0;(k+row)<n&&(i-k)>=0;++k)
board[row+k][i-k]=RED; //This reds out the diagonal left cells. Left upper rows unaltered as its too much of a useless bother
//------Done putting reds-----------
board[row][i]=OCCUPIED; //Placed queen on cell
nqueen(n,board,row+1);//Recursion continues
board[row][i]=BLACK; //Returns back to black for further iltertions
}
}
//------------------------------------------------
我很感谢你的建议,我仍然不敢相信我在那个循环上犯了这么愚蠢的错误,我把左边的单元格变红了如下:
for(int k=0;(k+row)<n&&(i-k)>=0;++k)
board[row+k][i-k]=RED; //This reds out the diagonal left cells. Left upper rows unaltered as its too much of a useless bother
本来忘记放的,后来没来得及看,不好意思。
无论如何,在将其更改为正常工作后,我发现它确实给了我一个输出,但仅适用于 n=5 。接下来,即使有 2 个输出[如果我正确满足 n=5 条件],它也只给我 1 个输出。对于其余的输入,它仍然在做同样的事情
至于编译器,我目前正在使用代码块,但我已经在 Turbo 中对其进行了调试。我意识到 Turbo 有一些问题,所以我在代码块中进行了最后几个更改。
至于 Visual Studio,我不能使用它。它 是 一个 付费 软件 , 因为 这 只是 一种 爱好 , 我 的 父母 会 因为 我 花钱 而 杀 了 我 .
这样的流程终止于 i=2 for n=5 和 i=4 for n=7 等等。n=5 的流程现在似乎在第一次通过后中断,而其余的仍然中断