The N-Queens Problem is a well-known challenge in computer science and is often considered an excellent case study for understanding algorithms, data structures, and recursion. The goal of this problem can be stated simply: how can you place N queens on an N x N chessboard such that no two queens threaten each other?
A queen in chess can move any number of squares vertically, horizontally, or diagonally. Hence, for the solution to be valid, no two queens must share the same row, column, or diagonal.
To make this clearer, let’s consider the 4-Queens Problem:
. Q . . (Queen at row 0, column 1)
. . . Q (Queen at row 1, column 3)
Q . . . (Queen at row 2, column 0)
. . Q . (Queen at row 3, column 2)
In the diagram above, we have successfully placed 4 queens in such a way that they do not threaten each other.
Backtracking is a systematic method for exploring all possible configurations of a solution. It builds a solution incrementally, abandoning configurations that fail to satisfy the constraints of the problem. In the context of the N-Queens Problem, that means placing queens one by one in different columns and checking if each placement leads to a valid board configuration.
To implement the backtracking algorithm, we will use a recursive function. This function will attempt to place queens row by row and will check for valid placements before proceeding.
Now, let's look at the Java implementation of the N-Queens Problem using backtracking.
import java.util.ArrayList; import java.util.List; public class NQueens { private List<List<String>> solutions = new ArrayList<>(); private int n; public List<List<String>> solveNQueens(int n) { this.n = n; char[][] board = new char[n][n]; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { board[i][j] = '.'; } } backtrack(board, 0); return solutions; } private void backtrack(char[][] board, int row) { if (row == n) { solutions.add(construct(board)); return; } for (int col = 0; col < n; col++) { if (isSafe(board, row, col)) { board[row][col] = 'Q'; // Place queen backtrack(board, row + 1); // Move to the next row board[row][col] = '.'; // Remove queen (backtrack) } } } private boolean isSafe(char[][] board, int row, int col) { // Check the column for (int i = 0; i < row; i++) { if (board[i][col] == 'Q') return false; } // Check the diagonal for (int i = row, j = col; i >= 0 && j >= 0; i--, j--) { if (board[i][j] == 'Q') return false; } for (int i = row, j = col; i >= 0 && j < n; i--, j++) { if (board[i][j] == 'Q') return false; } return true; } private List<String> construct(char[][] board) { List<String> result = new ArrayList<>(); for (char[] row : board) { result.add(new String(row)); } return result; } public static void main(String[] args) { NQueens nQueens = new NQueens(); List<List<String>> solutions = nQueens.solveNQueens(4); for (List<String> solution : solutions) { for (String row : solution) { System.out.println(row); } System.out.println(); } } }
solveNQueens
method initializes the chessboard and begins the backtracking process.backtrack
method recursively tries to place queens on the board. If a valid configuration is reached (when row
equals n
), it stores the configuration.isSafe
method checks if placing a queen at a given position would lead to conflicts with other queens.construct
method converts the board into a usable string representation for storage.The time complexity of the N-Queens problem is generally O(N!), where N is the number of queens. This is due to the fact that for each queen placed, we have to consider valid positions for the next one, often resulting in a factorial growth of possible permutations. The space complexity is O(N) for the recursive stack and the storage of results.
Throughout this exploration of the N-Queens Problem, we have seen how backtracking provides an effective approach to solving complex recursive challenges. The implementation in Java showcases both algorithm design and practical coding skills, making it a fantastic topic for both new and experienced programmers exploring advanced recursion and backtracking concepts.
13/10/2024 | DSA
06/12/2024 | DSA
08/12/2024 | DSA
16/11/2024 | DSA
23/09/2024 | DSA
15/11/2024 | DSA
06/12/2024 | DSA
06/12/2024 | DSA
16/11/2024 | DSA