TheN-Queens puzzle is the problem of placingNQueens onN×NChessboard such that no two queens attack each other.
Given an integerN, Return all distinct solutions toN-Queens puzzle.
Each solution contains a distinct board configuration ofN-Queens 'placement, where‘Q‘And‘.‘Both indicate a queen and an empty space respectively.
For example,
There exist two distinct solutions to the 4-Queens puzzle:
[ [".Q..", // Solution 1 "...Q", "Q...", "..Q."], ["..Q.", // Solution 2 "Q...", "...Q", ".Q.."]]
dfs method.
public class Solution { public List<String[]> solveNQueens(int n) { List<String[]> placement = new ArrayList<String[]>();if(n == 1){placement.add(new String[]{"Q"}); return placement; }if(n >= 4){List<Integer> position = new ArrayList<Integer>();dfs(n, 0, position, placement);}return placement;}private boolean dfs(int n, int row, List<Integer> position, List<String[]> placement){if(row == n) return true; for(int i = 0; i < n; ++i) {if(isValidPosition(row * n + i, position, n)){position.add(row * n + i);if(dfs(n, row + 1, position, placement))generateSolution(position,placement, n);position.remove(row);}}return false;}private boolean isValidPosition(int k, List<Integer> position, int n){for(int i = 0; i < position.size(); ++i){int alreadyAdded = position.get(i);if(k % n == alreadyAdded % n) // on the same columnreturn false;int row = alreadyAdded / n, currentRow = k / n;if((k % n == alreadyAdded % n - currentRow + row)||(k % n == alreadyAdded % n + currentRow - row)) //skew positionsreturn false;}return true;}private void generateSolution(List<Integer> position, List<String[]> placement, int n){char[] oneRow = new char[n];for(int i = 0; i < n; ++i)oneRow[i] = ‘.‘;String[] oneSolution = new String[n];for(int i = 0; i < n; ++i){oneRow[position.get(i) % n] = ‘Q‘;oneSolution[i] = new String(oneRow);oneRow[position.get(i) % n] = ‘.‘;}placement.add(oneSolution); }}