8x8棋盘上的5个女王

时间:2014-07-08 18:31:10

标签: c++ algorithm

我试图找到在国际象棋棋盘上设置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;
}

我有其他功能的其余源代码,例如generate forallowed和isDisallowed等,在this pastebin上。我认为这与问题无关,这里的代码不应该太长。

第一组的结果如下所示: enter image description here 那么我应该如何继续以便能够找到所有解决方案集?这就是我被卡住的地方。

1 个答案:

答案 0 :(得分:2)

首先,将这两个循环合并为一个:

for (size_t i = 0; i < BSIZE; i++)
{
    for (size_t j = 0; j < BSIZE; j++)
    {

相反:

for (size_t n = 0; n < (BSIZE * BSIZE); ++n)
{
    size_t i = n % BSIZE;
    size_t j = n / BSIZE;

现在,您的功能可以轻松地开始n。要找到“下一个”解决方案,只需删除最后一个女王(注意其位置)并调用FindNextQPos,告诉它从该女王的位置开始。如果那位女王已经在最后一个位置,请回去取下另一位女王。

如果找不到解决方案,请执行与找到解决方案相同的操作。删除最后一位女王并致电FindNextQPos,再次从你移除的女王的位置开始。

当你没有要移除的皇后时,你就完成了。

您可以使用一个“继续”功能执行此操作。无论您找到解决方案还是找不到解决方案,都可以调用此函数。它的逻辑是:

  1. 找到最后一位女王。如果没有最后的女王,请停止。我们完成了。

  2. 注意它的位置。删除它。

  3. 从我们注意到的位置之后的位置开始致电FindNextQPos。如果我们安排了女王,请继续尝试从位置0开始放置更多的女王,直到我们找到解决方案或者不能放置女王。

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

  5. 转到第1步。