Решение задачи о восьми ферзях. Нахождение всех решений. - EcsFlash/DataTypes GitHub Wiki
bool canPlace(int row, int col, const vector<int>& positions) {
for (int i = 0; i < row; i++) {
if (positions[i] == col ||
positions[i] - i == col - row ||
positions[i] + i == col + row) {
return false;
}
}
return true;
}
void countSolutions(int n, int row, vector<int>& positions, int& count) {
if (row == n) {
count++;
return;
}
for (int col = 0; col < n; col++) {
if (canPlace(row, col, positions)) {
positions[row] = col;
countSolutions(n, row + 1, positions, count);
}
}
}
Здесь всё тоже самое, что и в поиске одного решения, только при нахождении первого решения мы не останавливаем программу, а продолжаем расставлять дальше. Как только нашли решение, проверяем оставшиеся столбцы. После их проверки откатываемся на строчку назад, и начинаем двигать предыдущего ферзя дальше по столбцам. После того, как закончили по всем столбцам, возвращаем ещё на строчку назад и тд... Сложность программы O(N!)