J'essaie de trouver le nombre de façons possibles de placer 5 reines sur un échiquier sans qu'elles puissent s'attaquer l'une à l'autre. J'ai réussi à trouver le premier set. Le problème est de savoir comment je serais capable de trouver la prochaine série de positions pour 5 reines. La procédure dans mon programme est comme ceci:5 reines sur un échiquier 8x8
- Générez un vecteur de positions non admises sur la base des reines actuelles sur la carte
- boucle à travers toutes les positions sur la carte
- Vérifiez si la position actuelle est un des positions non admises sur la carte
- Dans le cas contraire, le retour de la position, l'ajouter au vecteur des reines sur le plateau et recommencer le processus
Continuer jusqu'à ce qu'il n'y a pas plus p osition disponible à-dire toutes les positions restantes sont refusé
#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;
}
reste du code source où j'ai les autres fonctions, telles que de générer et rejeté et isDisallowed etc est sur this pastebin. Je pensais que ce ne serait pas vraiment lié à la question et le code ne devrait pas être trop long.
Le résultat du premier jeu ressemble à ceci: Alors, comment dois-je continuer pour être en mesure de trouver tous les jeux de solution? C'est là que je suis coincé.
Devez-vous d'utiliser le code, ou suffirait d'une solution combinatoire? – abiessu
@abiessu Je préfère utiliser le code. Avec la solution combinatoire, je n'aurais même pas eu besoin d'aller aussi loin, non? Pourrait calculer basé sur la taille du conseil et le nombre de reines, je suppose. – Erfan
Pourquoi je vote sur cette question? Quelqu'un pourrait-il m'expliquer? – Erfan