Тема: Завдання про n ферзів на дошці n x n
Потрібно знайти кількість рішень того, як можна розмістити n ферзів на шаховій дошці n x n так, щоб вони не били одне одного.
Ось що в мене вийшло:
using namespace std;
class Solution {
bool is_not_under_attack(vector<vector<int>>& board, int& row, int& col)
{
bool answer { true };
if (board.at(row).at(col) != 0) {
answer = false;
}
return answer;
}
void place_queen(vector<vector<int>>& board, const int& n, int row, int col)
{
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (board.at(i).at(j) == 0 && (i == row || j == col || (i - row == j - col) || (i + j == col + row))) {
board.at(i).at(j) = 1;
}
}
}
}
void remove_queen(vector<vector<int>>& board, const int& n, int row, int col)
{
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (board.at(i).at(j) != 0 && (i == row || j == col || (i - row == j - col) || (i + j == col + row))) {
board.at(i).at(j) = 0;
}
}
}
}
int backtrack_nqueens(vector<vector<int>>& board, const int& n, int row, int count)
{
for (int col = 0; col < n; ++col) {
if (is_not_under_attack(board, row, col)) {
place_queen(board, n, row, col);
if (row + 1 == n) {
++count;
} else {
count = backtrack_nqueens(board, n, row + 1, count);
}
remove_queen(board, n, row, col);
}
}
return count;
}
public:
int totalNQueens(int n)
{
vector<vector<int>> board(n, vector<int>(n, 0));
int answer = backtrack_nqueens(board, n, 0, 0);
return answer;
}
};
int main()
{
int n { 4 };
Solution obj;
int answer = obj.totalNQueens(n);
cout << answer << endl;
return 0;
}
Але десь там помилка і я не знаю, де саме.
Забагато рішень нараховує.