package com.interview.leetcode.backtracing; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other. * Given an integer n, return all distinct solutions to the n-queens puzzle. */ public class NQueens { public List<String[]> solutions(int n) { List<String[]> sols = new ArrayList<>(); int[] queens = new int[n]; int offset = 0; queens[offset] = -1; while (offset >= 0 && offset < n) { queens[offset]++; while (queens[offset] < n && canPlace(offset, queens) == false) queens[offset]++; if (queens[offset] == n) { offset--; } else { if (offset == n - 1) sols.add(getSolution(queens)); else { offset++; queens[offset] = -1; } } } return sols; } public int solutionCount(int n) { int count = 0; int[] queens = new int[n]; int offset = 0; queens[offset] = -1; while (offset >= 0 && offset < n) { queens[offset]++; while (queens[offset] < n && !canPlace(offset, queens)) queens[offset]++; if (queens[offset] == n) { offset--; } else { if (offset == n - 1) count++; else { offset++; queens[offset] = -1; } } } return count; } public boolean canPlace(int offset, int[] queens) { for (int i = 0; i < offset; i++) { if (queens[i] == queens[offset] || (Math.abs(queens[i] - queens[offset]) == offset - i)) return false; } return true; } public String[] getSolution(int[] queens) { String[] rows = new String[queens.length]; char[] chars = new char[queens.length]; Arrays.fill(chars, '.'); for (int i = 0; i < queens.length; i++) { chars[queens[i]] = 'Q'; rows[i] = String.valueOf(chars); chars[queens[i]] = '.'; } return rows; } public static void main(String[] args) { NQueens solver = new NQueens(); solver.solutionCount(1); } }