C++ 8x8棋盘上有5个皇后

C++ 8x8棋盘上有5个皇后,c++,algorithm,C++,Algorithm,我正试图找到在一个棋盘上放置5个皇后而不让它们互相攻击的方法。我成功地找到了第一套。问题是我如何才能找到下一组5个皇后的位置。我的程序中的程序如下所示: 根据板上的当前皇后生成不允许位置的向量 在电路板上的所有位置循环 检查当前位置是否为板上不允许的位置之一 如果不是,返回位置,将其添加到板上的皇后向量中,然后再次开始该过程 继续,直到没有更多职位可用,即所有剩余职位都不允许 #include <iostream> #include <vector> using n

我正试图找到在一个棋盘上放置5个皇后而不让它们互相攻击的方法。我成功地找到了第一套。问题是我如何才能找到下一组5个皇后的位置。我的程序中的程序如下所示:

  • 根据板上的当前皇后生成不允许位置的向量
  • 在电路板上的所有位置循环
  • 检查当前位置是否为板上不允许的位置之一
  • 如果不是,返回位置,将其添加到板上的皇后向量中,然后再次开始该过程
继续,直到没有更多职位可用,即所有剩余职位都不允许

#include <iostream>
#include <vector>

using namespace std;
const int BSIZE = 8;
char chessBoard[BSIZE][BSIZE];

struct qPos
{
    qPos() : h(0), v(0), found(true) {}
    int h; //horizontal pos
    int v; //vertical pos
    bool found; //if position is available
};

qPos findNextQPos(vector<qPos> Qs);
void fillBoard(vector<qPos> Qs);
void print();
vector<qPos> generateDisallowed(vector<qPos> Qs);
bool isDisallowed(qPos nextPos, vector<qPos> disallowedPos);

int main(int argc, char **argv){
    vector<qPos> QsOnBoard; //Position of all the queens on board
    qPos nextQ; //next possible position
    while (nextQ.found)
    {
        nextQ = findNextQPos(QsOnBoard);
        if (nextQ.found)
        {
            QsOnBoard.push_back(nextQ); //If the nextQ is available i.e. not disallowed, add it to the queens vector
        }
    }
    fillBoard(QsOnBoard); //Fill the board with queens positions
    print(); // print the board
    return 0;
}

qPos findNextQPos(vector<qPos> Qs) {
    // Generate disallowed positions based on all the queens on board
    vector <qPos> disallowedPos = generateDisallowed(Qs);
    qPos nextQ;
    for (size_t i = 0; i < BSIZE; i++)
    {
        for (size_t j = 0; j < BSIZE; j++)
        {
            nextQ.h = i;
            nextQ.v = j;
            if (!isDisallowed(nextQ, disallowedPos)) { //Check if next possible position is a disallowed position
                //cout << "Next available:\n" << nextQ.h << ", " << nextQ.v << endl;
                return nextQ; // if it is avaible return the position, break the loop
            }
        }
    }
    nextQ.found = false; // No available position is found to return, found is set to false, return the position
    return nextQ;
}
#包括
#包括
使用名称空间std;
常量int BSIZE=8;
字符棋盘[BSIZE][BSIZE];
结构qPos
{
qPos():h(0),v(0),found(true){
int h;//水平位置
int v;//垂直位置
bool found;//如果位置可用
};
QPO FindNextQPO(矢量Qs);
空心填充板(矢量Qs);
作废打印();
向量发生器(向量Qs);
不允许bool(qPos下一个TPOS,向量不允许POS);
int main(int argc,字符**argv){
vector QsOnBoard;//船上所有皇后的位置
qPos nextQ;//下一个可能的位置
while(nextQ.found)
{
nextQ=FindNextQPO(QSO);
if(nextQ.found)
{
QsOnBoard.push_back(nextQ);//如果nextQ可用,即不允许,则将其添加到queens向量
}
}
填充板(QsOnBoard);//在板上填充皇后位置
print();//打印电路板
返回0;
}
QPO FindNextQPO(矢量Qs){
//根据船上的所有皇后生成不允许的位置
vector disallowedPos=generateDisallowed(Qs);
qPos nextQ;
对于(大小i=0;i//cout首先,将这两个循环合并为一个:

for (size_t i = 0; i < BSIZE; i++)
{
    for (size_t j = 0; j < BSIZE; j++)
    {
(大小i=0;i { 对于(大小j=0;j
相反:

for (size_t n = 0; n < (BSIZE * BSIZE); ++n)
{
    size_t i = n % BSIZE;
    size_t j = n / BSIZE;
用于(大小n=0;n<(BSIZE*BSIZE);++n)
{
尺寸=n%b尺寸;
尺寸j=n/b尺寸;
现在,您的函数可以轻松地开始执行
n
。要找到“下一个”解决方案,只需删除最后一个皇后(注意其位置)并调用
FindNextQPos
,告诉它从该皇后前面的位置开始。如果该皇后已经在最后一个位置,请返回并删除另一个皇后

如果找不到解决方案,请执行与找到解决方案相同的操作。删除最后一个皇后,然后调用
FindNextQPos
,再次从您删除的皇后位置开始

当你没有皇后要移除时,你就完蛋了

您可以使用单个“continue”函数完成此操作。无论您找到解决方案还是未找到解决方案,都可以调用此函数。其逻辑为:

  • 找到最后一个女王。如果没有最后一个女王,停下来。我们完了

  • 记下它的位置,取下它

  • 调用
    FindNextQPos
    从我们注意到的位置1开始。如果我们放置皇后,请继续尝试从位置0开始放置更多皇后,直到找到解决方案或无法放置皇后

  • 如果我们找到了解决方案,请将其输出

  • 转到步骤1


  • 你需要使用密码,还是组合解决方案就足够了?@abiessu我更喜欢使用密码。有了组合解决方案,我甚至不需要走这么远,对吧?我想可以根据董事会的规模和皇后的数量来计算。为什么我要在这个问题上投票?有人能解释一下吗?不确定关于否决票,你似乎自己做了一些工作来尝试解决问题,你似乎自己也试图理解问题空间。我建议采用组合路线,因为通过每个解决方案几乎肯定会产生许多重复的皇后队形,包括旋转、翻转和平移棋盘空间。@abiessu是的,我知道旋转和翻转会有很多解决方案,但我实际上在寻找独特的解决方案。但是出于好奇,你能告诉我组合解决方案吗?谢谢,听起来它会起作用!对我来说,仅仅通过阅读理解它有点困难,但我尝试了。所以基本上是这样我们要做的是一直向前移动最后一个皇后,直到我们到达终点。然后移动另一个皇后,对吗?走到终点的皇后会发生什么?当一个皇后到达终点时,你将其移除。然后你重复,再次移除最后一个皇后,并尝试推进它。(为了理解这个算法,你可能需要在脑海中思考一下这样的情况:你只是想把五块放在棋盘上的任何地方。然后你只需要数数,这正是这个算法所做的。当你数数时,如何从19到20?9之后没有下一个数字,所以你去掉最后一个数字,增加第一个数字数字,然后尝试从零开始放置新的最后一个数字。)如果我在这里听起来像个白痴,我很抱歉,但是如果我删除了棋盘上的皇后,将剩下4个皇后,而不再是5个。这为设置它们开辟了许多新的方式。@尔凡我不确定我是否明白你的意思。你必须先在一块空棋盘上放置一个皇后。然后你必须在一块已经有一个皇后的棋盘上放置第二个皇后它。(它可以帮助你完成一个简单的例子,比如每三位数输出一个数字。首先你放置第一个数字,然后第二个,然后第三个,然后你输出一个解决方案。然后你移除第三个数字,并尝试将一个更大的数字放置在它的位置。等等。)