classSolution{List<String> path =newArrayList<>();List<List<String>> result =newArrayList<>();publicList<List<String>>solveNQueens(int n){backtracking(n,0);return result;}privatevoidbacktracking(int n,int row){if(row == n){
result.add(newArrayList<>(path));return;}for(int i =0; i < n; i++){if(!isValid(row, i, n)){continue;}
path.add(constructString(n, i));backtracking(n, row+1);
path.remove(path.size()-1);}}privatebooleanisValid(int row,int col,int n){for(int i =0; i < row; i++){// check colif(path.get(i).charAt(col)=='Q'){returnfalse;}}for(int i = row-1, j = col-1; i >=0&& j >=0; i--, j--){if(path.get(i).charAt(j)=='Q'){returnfalse;}}for(int i = row-1, j = col+1; i >=0&& j < n; i--, j++){if(path.get(i).charAt(j)=='Q'){returnfalse;}}returntrue;}privateStringconstructString(int n,int col){StringBuilder result =newStringBuilder();for(int i =0; i < n; i++){if(i == col){
result.append("Q");}else{
result.append(".");}}return result.toString();}}
37. 解数独
classSolution{char[][] result =newchar[9][9];publicvoidsolveSudoku(char[][] board){backtracking(board);for(int i =0; i <9; i++){for(int j =0; j <9; j++){
board[i][j]= result[i][j];}}}privatevoidbacktracking(char[][] board){if(findEmpty(board)==null){for(int i =0; i <9; i++){for(int j =0; j <9; j++){
result[i][j]= board[i][j];}}return;}int[] pos =findEmpty(board);int row = pos[0];int col = pos[1];for(int i =1; i <10; i++){char digit =(char)(i +'0');if(!isValidSudoku(row, col, digit, board)){continue;}
board[row][col]= digit;backtracking(board);
board[row][col]='.';}}privateint[]findEmpty(char[][] board){for(int i =0; i <9; i++){for(int j =0; j <9; j++){if(board[i][j]=='.'){returnnewint[]{i, j};}}}returnnull;}privatebooleanisValidSudoku(int row,int col,char val,char[][] board){// Check if the same digit already exists in the same rowfor(int i =0; i <9; i++){if(board[row][i]== val){returnfalse;}}// Check if the same digit already exists in the same columnfor(int j =0; j <9; j++){if(board[j][col]== val){returnfalse;}}// Check if the same digit already exists in the same 3x3 gridint startRow =(row /3)*3;int startCol =(col /3)*3;for(int i = startRow; i < startRow +3; i++){for(int j = startCol; j < startCol +3; j++){if(board[i][j]== val){returnfalse;}}}returntrue;}}