NQueen
Get all valid ways of putting N Queens on an N * N chessboard so that no two Queens threaten each other.
Assumptions
N > 0
Return
A list of ways of putting the N Queens
Each way is represented by a list of the Queen's y index for x indices of 0 to (N - 1)
Example
N = 4, there are two ways of putting 4 queens:
[1, 3, 0, 2] --> the Queen on the first row is at y index 1, the Queen on the second row is at y index 3, the Queen on the third row is at y index 0 and the Queen on the fourth row is at y index 2.
[2, 0, 3, 1] --> the Queen on the first row is at y index 2, the Queen on the second row is at y index 0, the Queen on the third row is at y index 3 and the Queen on the fourth row is at y index 1.
Solution: Recursive DFS, backtracking
Base Case: When max length reached, add current to result
Recursive Rule: Branch and recursive call every valid position
public List<List<Integer>> nqueens(int n) {
List<List<Integer>> result = new ArrayList<>();
List<Integer> cur = new ArrayList<>();
helper( n, cur , result);
return result;
}
private void helper(int n , List<Integer> cur , List<List<Integer>> result){
if (cur.size() == n) {
result.add(new ArrayList<Integer>(cur));
return;
}
for (int i = 0; i < n; i++){
if (valid(cur, i)){
cur.add(i);
helper(n, cur, result);
cur.remove(cur.size() - 1);
}
}
}
private boolean valid(List<Integer> cur, int column){
int row = cur.size();
for (int i = 0; i < row; i++){
if (cur.get(i) == column || Math.abs(cur.get(i) - column) == row - i){
return false;
}
}
return true;
}
Time Complexity: O(N!) helper calls * O(N) valid check = O(N! * N)
Space Complexity: O(N) List cur * ~O(N) List result = O(N^2)
Last updated
Was this helpful?