diff --git a/N-queens b/N-queens new file mode 100644 index 00000000..4d5a79c2 --- /dev/null +++ b/N-queens @@ -0,0 +1,67 @@ +// time O( n! ) + +// Space Complexity: O( n^2 ) for the board + O( n ) recursive stack space + + + + +class Solution { + List> result; + boolean[][] board; + boolean[] colSet; + boolean[] mainDiagSet; + boolean[] antiDiagSet; + public List> solveNQueens(int n) { + this.result = new ArrayList<>(); + this.board = new boolean[n][n]; + this.colSet = new boolean[2*n]; + this.mainDiagSet = new boolean[2*n]; + this.antiDiagSet = new boolean[2*n]; + + helper(0, n); + + return result; + } + + private void helper(int r , int n){ + + if(r == n){ + List list = new ArrayList<>(); + for(int i=0; i queue = new LinkedList<>(); + boolean[][] visited = new boolean[rows][cols]; + visited[startI][startJ] = true; + queue.offer(new State(startI, startJ, 0, visited)); + + while (!queue.isEmpty()) { + State curr = queue.poll(); + int i = curr.i, j = curr.j, idx = curr.idx; + boolean[][] vis = curr.visited; + + if (idx == word.length() - 1) return true; + + for (int[] dir : directions) { + int newI = i + dir[0]; + int newJ = j + dir[1]; + + if (newI >= 0 && newJ >= 0 && newI < rows && newJ < cols && !vis[newI][newJ]) { + if (board[newI][newJ] == word.charAt(idx + 1)) { + boolean[][] newVis = deepCopy(vis); + newVis[newI][newJ] = true; + queue.offer(new State(newI, newJ, idx + 1, newVis)); + } + } + } + } + + return false; + } + + private boolean[][] deepCopy(boolean[][] original) { + int m = original.length; + int n = original[0].length; + boolean[][] copy = new boolean[m][n]; + for (int i = 0; i < m; i++) { + System.arraycopy(original[i], 0, copy[i], 0, n); + } + return copy; + } + + private static class State { + int i, j, idx; + boolean[][] visited; + + State(int i, int j, int idx, boolean[][] visited) { + this.i = i; + this.j = j; + this.idx = idx; + this.visited = visited; + } + } +}