#include <iostream>
#include <vector>
#include <string>
using namespace std;
bool isSafe(int row, int col, const vector<string>& board, int n) {
// Check column for another queen
for (int i = 0; i < row; i++) {
if (board[i][col] == 'Q') return false;
}
// Check upper left diagonal
for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
if (board[i][j] == 'Q') return false;
}
// Check upper right diagonal
for (int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {
if (board[i][j] == 'Q') return false;
}
return true;
}
bool solveNQueens(int row, vector<string>& board, int n) {
if (row == n) return true; // All queens placed
for (int col = 0; col < n; col++) {
if (isSafe(row, col, board, n)) {
board[row][col] = 'Q'; // Place queen
if (solveNQueens(row + 1, board, n)) return true; // Recurse
board[row][col] = '.'; // Backtrack
}
}
return false; // No safe position found
}
int main() {
int n = 4;
vector<string> board(n, string(n, '.'));
if (solveNQueens(0, board, n)) {
for (const string& row : board) {
cout << row << "\n";
}
} else {
cout << "No solution found\n";
}
return 0;
}
for (int col = 0; col < n; col++) {
Try each column in current row to find safe spot
if (isSafe(row, col, board, n)) {
Check if placing queen here causes no attacks
Place queen at safe position
if (solveNQueens(row + 1, board, n)) return true;
Recurse to next row to place next queen
Backtrack by removing queen if no solution found ahead