vector<vector<string>> solveNQueens(int n) {
vector<vector<string>> result;
vector<int> cols;
auto isSafe = [&](int row, int col) -> bool {
for (int r = 0; r < row; r++) {
int c = cols[r];
if (c == col || abs(c - col) == row - r) return false;
}
return true;
};
function<void(int)> place = [&](int row) {
if (row == n) {
vector<string> board;
for (int c : cols) board.push_back(string(c, '.') + 'Q' + string(n - c - 1, '.'));
result.push_back(board);
return;
}
for (int col = 0; col < n; col++) {
if (!isSafe(row, col)) continue;
cols.push_back(col);
place(row + 1);
cols.pop_back();
}
};
place(0);
return result;
}
public List<List<String>> solveNQueens(int n) {
List<List<String>> result = new ArrayList<>();
List<Integer> cols = new ArrayList<>();
place(0, n, cols, result);
return result;
}
private boolean isSafe(List<Integer> cols, int row, int col) {
for (int r = 0; r < row; r++) {
int c = cols.get(r);
if (c == col || Math.abs(c - col) == row - r) return false;
}
return true;
}
private void place(int row, int n, List<Integer> cols, List<List<String>> result) {
if (row == n) {
List<String> board = new ArrayList<>();
for (int c : cols) board.add(".".repeat(c) + "Q" + ".".repeat(n - c - 1));
result.add(board);
return;
}
for (int col = 0; col < n; col++) {
if (!isSafe(cols, row, col)) continue;
cols.add(col);
place(row + 1, n, cols, result);
cols.remove(cols.size() - 1);
}
}
def solve_n_queens(n):
result = []
cols = []
def is_safe(row, col):
for r in range(row):
c = cols[r]
if c == col or abs(c - col) == row - r: return False
return True
def place(row):
if row == n:
result.append(['.' * c + 'Q' + '.' * (n - c - 1) for c in cols])
return
for col in range(n):
if not is_safe(row, col): continue
cols.append(col)
place(row + 1)
cols.pop()
place(0)
return result
function solveNQueens(n: number): string[][] {
const result: string[][] = [];
const cols: number[] = [];
const isSafe = (row: number, col: number): boolean => {
for (let r = 0; r < row; r++) {
const c = cols[r];
if (c === col || Math.abs(c - col) === row - r) return false;
}
return true;
};
const place = (row: number): void => {
if (row === n) {
result.push(cols.map((c) => '.'.repeat(c) + 'Q' + '.'.repeat(n - c - 1)));
return;
}
for (let col = 0; col < n; col++) {
if (!isSafe(row, col)) continue;
cols.push(col);
place(row + 1);
cols.pop();
}
};
place(0);
return result;
}
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>> result;
vector<int> cols;
set<int> usedCol, usedDiag, usedAnti;
function<void(int)> place = [&](int row) {
if (row == n) {
vector<string> board;
for (int c : cols) board.push_back(string(c, '.') + 'Q' + string(n - c - 1, '.'));
result.push_back(board);
return;
}
for (int col = 0; col < n; col++) {
if (usedCol.count(col) || usedDiag.count(row - col) || usedAnti.count(row + col)) continue;
usedCol.insert(col); usedDiag.insert(row - col); usedAnti.insert(row + col);
cols.push_back(col);
place(row + 1);
cols.pop_back();
usedCol.erase(col); usedDiag.erase(row - col); usedAnti.erase(row + col);
}
};
place(0);
return result;
}
public List<List<String>> solveNQueens(int n) {
List<List<String>> result = new ArrayList<>();
List<Integer> cols = new ArrayList<>();
Set<Integer> usedCol = new HashSet<>(), usedDiag = new HashSet<>(), usedAnti = new HashSet<>();
place(0, n, cols, usedCol, usedDiag, usedAnti, result);
return result;
}
private void place(int row, int n, List<Integer> cols, Set<Integer> usedCol, Set<Integer> usedDiag, Set<Integer> usedAnti, List<List<String>> result) {
if (row == n) {
List<String> board = new ArrayList<>();
for (int c : cols) board.add(".".repeat(c) + "Q" + ".".repeat(n - c - 1));
result.add(board);
return;
}
for (int col = 0; col < n; col++) {
if (usedCol.contains(col) || usedDiag.contains(row - col) || usedAnti.contains(row + col)) continue;
usedCol.add(col); usedDiag.add(row - col); usedAnti.add(row + col);
cols.add(col);
place(row + 1, n, cols, usedCol, usedDiag, usedAnti, result);
cols.remove(cols.size() - 1);
usedCol.remove(col); usedDiag.remove(row - col); usedAnti.remove(row + col);
}
}
def solve_n_queens(n):
result = []
cols = []
used_col, used_diag, used_anti = set(), set(), set()
def place(row):
if row == n:
result.append(['.' * c + 'Q' + '.' * (n - c - 1) for c in cols])
return
for col in range(n):
if col in used_col or row - col in used_diag or row + col in used_anti: continue
used_col.add(col); used_diag.add(row - col); used_anti.add(row + col)
cols.append(col)
place(row + 1)
cols.pop()
used_col.discard(col); used_diag.discard(row - col); used_anti.discard(row + col)
place(0)
return result
function solveNQueens(n: number): string[][] {
const result: string[][] = [];
const cols: number[] = [];
const usedCol = new Set<number>(), usedDiag = new Set<number>(), usedAnti = new Set<number>();
const place = (row: number): void => {
if (row === n) {
result.push(cols.map((c) => '.'.repeat(c) + 'Q' + '.'.repeat(n - c - 1)));
return;
}
for (let col = 0; col < n; col++) {
if (usedCol.has(col) || usedDiag.has(row - col) || usedAnti.has(row + col)) continue;
usedCol.add(col); usedDiag.add(row - col); usedAnti.add(row + col);
cols.push(col);
place(row + 1);
cols.pop();
usedCol.delete(col); usedDiag.delete(row - col); usedAnti.delete(row + col);
}
};
place(0);
return result;
}
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>> result;
vector<int> cols;
int full = (1 << n) - 1;
function<void(int, int, int, int)> place = [&](int row, int colMask, int diagMask, int antiMask) {
if (row == n) {
vector<string> board;
for (int c : cols) board.push_back(string(c, '.') + 'Q' + string(n - c - 1, '.'));
result.push_back(board);
return;
}
int free = full & ~(colMask | diagMask | antiMask);
while (free != 0) {
int bit = free & -free;
free ^= bit;
int col = __builtin_ctz(bit);
cols.push_back(col);
place(row + 1, colMask | bit, ((diagMask | bit) << 1) & full, (antiMask | bit) >> 1);
cols.pop_back();
}
};
place(0, 0, 0, 0);
return result;
}
public List<List<String>> solveNQueens(int n) {
List<List<String>> result = new ArrayList<>();
List<Integer> cols = new ArrayList<>();
int full = (1 << n) - 1;
place(0, 0, 0, 0, n, full, cols, result);
return result;
}
private void place(int row, int colMask, int diagMask, int antiMask, int n, int full, List<Integer> cols, List<List<String>> result) {
if (row == n) {
List<String> board = new ArrayList<>();
for (int c : cols) board.add(".".repeat(c) + "Q" + ".".repeat(n - c - 1));
result.add(board);
return;
}
int free = full & ~(colMask | diagMask | antiMask);
while (free != 0) {
int bit = free & -free;
free ^= bit;
int col = Integer.numberOfTrailingZeros(bit);
cols.add(col);
place(row + 1, colMask | bit, ((diagMask | bit) << 1) & full, (antiMask | bit) >> 1, n, full, cols, result);
cols.remove(cols.size() - 1);
}
}
def solve_n_queens(n):
result = []
cols = []
full = (1 << n) - 1
def place(row, col_mask, diag_mask, anti_mask):
if row == n:
result.append(['.' * c + 'Q' + '.' * (n - c - 1) for c in cols])
return
free = full & ~(col_mask | diag_mask | anti_mask)
while free:
bit = free & -free
free ^= bit
col = bit.bit_length() - 1
cols.append(col)
place(row + 1, col_mask | bit, ((diag_mask | bit) << 1) & full, (anti_mask | bit) >> 1)
cols.pop()
place(0, 0, 0, 0)
return result
function solveNQueens(n: number): string[][] {
const result: string[][] = [];
const cols: number[] = [];
const full = (1 << n) - 1;
const place = (row: number, colMask: number, diagMask: number, antiMask: number): void => {
if (row === n) {
result.push(cols.map((c) => '.'.repeat(c) + 'Q' + '.'.repeat(n - c - 1)));
return;
}
let free = full & ~(colMask | diagMask | antiMask);
while (free !== 0) {
const bit = free & -free;
free ^= bit;
const col = 31 - Math.clz32(bit);
cols.push(col);
place(row + 1, colMask | bit, ((diagMask | bit) << 1) & full, (antiMask | bit) >> 1);
cols.pop();
}
};
place(0, 0, 0, 0);
return result;
}
vector<vector<string>> solveNQueens(int n) {
if (n <= 0) return {};
vector<vector<string>> result;
vector<int> cols(n, 0);
int full = (1 << n) - 1;
auto draw = [&](bool mirror) {
vector<string> board;
for (int c : cols) { int q = mirror ? n - 1 - c : c; board.push_back(string(q, '.') + 'Q' + string(n - q - 1, '.')); }
return board;
};
function<void(int, int, int, int, bool)> place = [&](int row, int colMask, int diagMask, int antiMask, bool mirrored) {
if (row == n) {
result.push_back(draw(false));
if (mirrored) result.push_back(draw(true));
return;
}
int free = full & ~(colMask | diagMask | antiMask);
if (row == 0) free &= (1 << (n >> 1)) - 1;
while (free != 0) {
int bit = free & -free;
free ^= bit;
cols[row] = __builtin_ctz(bit);
place(row + 1, colMask | bit, ((diagMask | bit) << 1) & full, (antiMask | bit) >> 1, mirrored || row == 0);
}
};
place(0, 0, 0, 0, false);
if (n & 1) {
int bit = 1 << (n >> 1);
cols[0] = n >> 1;
place(1, bit, (bit << 1) & full, bit >> 1, false);
}
return result;
}
public List<List<String>> solveNQueens(int n) {
if (n <= 0) return new ArrayList<>();
List<List<String>> result = new ArrayList<>();
int[] cols = new int[n];
int full = (1 << n) - 1;
place(0, 0, 0, 0, false, n, full, cols, result);
if ((n & 1) != 0) {
int bit = 1 << (n >> 1);
cols[0] = n >> 1;
place(1, bit, (bit << 1) & full, bit >> 1, false, n, full, cols, result);
}
return result;
}
private List<String> draw(int[] cols, int n, boolean mirror) {
List<String> board = new ArrayList<>();
for (int c : cols) { int q = mirror ? n - 1 - c : c; board.add(".".repeat(q) + "Q" + ".".repeat(n - q - 1)); }
return board;
}
private void place(int row, int colMask, int diagMask, int antiMask, boolean mirrored, int n, int full, int[] cols, List<List<String>> result) {
if (row == n) {
result.add(draw(cols, n, false));
if (mirrored) result.add(draw(cols, n, true));
return;
}
int free = full & ~(colMask | diagMask | antiMask);
if (row == 0) free &= (1 << (n >> 1)) - 1;
while (free != 0) {
int bit = free & -free;
free ^= bit;
cols[row] = Integer.numberOfTrailingZeros(bit);
place(row + 1, colMask | bit, ((diagMask | bit) << 1) & full, (antiMask | bit) >> 1, mirrored || row == 0, n, full, cols, result);
}
}
def solve_n_queens(n):
if n <= 0: return []
result = []
cols = [0] * n
full = (1 << n) - 1
def draw(mirror):
out = []
for c in cols:
q = n - 1 - c if mirror else c
out.append('.' * q + 'Q' + '.' * (n - q - 1))
return out
def place(row, col_mask, diag_mask, anti_mask, mirrored):
if row == n:
result.append(draw(False))
if mirrored: result.append(draw(True))
return
free = full & ~(col_mask | diag_mask | anti_mask)
if row == 0: free &= (1 << (n >> 1)) - 1
while free:
bit = free & -free
free ^= bit
cols[row] = bit.bit_length() - 1
place(row + 1, col_mask | bit, ((diag_mask | bit) << 1) & full, (anti_mask | bit) >> 1, mirrored or row == 0)
place(0, 0, 0, 0, False)
if n & 1:
bit = 1 << (n >> 1)
cols[0] = n >> 1
place(1, bit, (bit << 1) & full, bit >> 1, False)
return result
function solveNQueens(n: number): string[][] {
if (n <= 0) return [];
const result: string[][] = [];
const cols = new Array<number>(n).fill(0);
const full = (1 << n) - 1;
const draw = (mirror: boolean): string[] =>
cols.map((c) => { const q = mirror ? n - 1 - c : c; return '.'.repeat(q) + 'Q' + '.'.repeat(n - q - 1); });
const place = (row: number, colMask: number, diagMask: number, antiMask: number, mirrored: boolean): void => {
if (row === n) {
result.push(draw(false));
if (mirrored) result.push(draw(true));
return;
}
let free = full & ~(colMask | diagMask | antiMask);
if (row === 0) free &= (1 << (n >> 1)) - 1;
while (free !== 0) {
const bit = free & -free;
free ^= bit;
cols[row] = 31 - Math.clz32(bit);
place(row + 1, colMask | bit, ((diagMask | bit) << 1) & full, (antiMask | bit) >> 1, mirrored || row === 0);
}
};
place(0, 0, 0, 0, false);
if (n & 1) {
const bit = 1 << (n >> 1);
cols[0] = n >> 1;
place(1, bit, (bit << 1) & full, bit >> 1, false);
}
return result;
}