Решение задачи о восьми ферзях. Нахождение всех решений. - 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!)

⚠️ **GitHub.com Fallback** ⚠️