我试图找到在国际象棋棋盘上设置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上。我认为这与问题无关,这里的代码不应该太长。
第一组的结果如下所示: 那么我应该如何继续以便能够找到所有解决方案集?这就是我被卡住的地方。
答案 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
,再次从你移除的女王的位置开始。
当你没有要移除的皇后时,你就完成了。
您可以使用一个“继续”功能执行此操作。无论您找到解决方案还是找不到解决方案,都可以调用此函数。它的逻辑是:
找到最后一位女王。如果没有最后的女王,请停止。我们完成了。
注意它的位置。删除它。
从我们注意到的位置之后的位置开始致电FindNextQPos
。如果我们安排了女王,请继续尝试从位置0开始放置更多的女王,直到我们找到解决方案或者不能放置女王。
如果我们找到了解决方案,请将其输出。
转到第1步。