51. N 皇后
java的字符串不太好用,需要注意很多细节
class Solution {List<List<String>> res = new ArrayList<>();public List<List<String>> solveNQueens(int n) {char[][] chessboard = new char[n][n];for (char[] row : chessboard) {Arrays.fill(row, '.');}backtrack(n, 0, chessboard);return res;}public void backtrack(int n, int row, char[][] chessboard) {if (row == n) {res.add(Array2List(chessboard));return;}for (int col = 0; col < n; ++col) {if (isValid(chessboard, row, col, n)) {chessboard[row][col] = 'Q';backtrack(n, row + 1, chessboard);chessboard[row][col] = '.';}}}public List<String> Array2List(char[][] chessboard) {List<String> list = new ArrayList<>();for (char[] row : chessboard) {list.add(new String(row));}return list;}public boolean isValid(char[][] chessboard, int row, int col, int n) {// 检查列for (int i=0; i<row; ++i) { // 相当于剪枝if (chessboard[i][col] == 'Q') {return false;}}// 检查45度对角线for (int i=row-1, j=col-1; i>=0 && j>=0; i--, j--) {if (chessboard[i][j] == 'Q') {return false;}}// 检查135度对角线for (int i=row-1, j=col+1; i>=0 && j<=n-1; i--, j++) {if (chessboard[i][j] == 'Q') {return false;}}return true;}}
37. 解数独
return false;没有终止条件也不会因为填不满棋盘而无限递归下去class Solution {public void solveSudoku(char[][] board) {backtrack(board);}//选择一个符合条件的路径即可,则有返回值public boolean backtrack(char[][] board) {for (int i = 0; i < board.length; ++i) {for (int j = 0; j < board[0].length; ++j) {if (board[i][j] != '.') {continue;}for (char k = '1'; k <= '9'; ++k) {if (isValid(board, i, j, k)) {board[i][j] = k;if (backtrack(board)) {return true;}board[i][j] = '.';}}return false; //关键,9个数都不行,则直接数独无解}}return true;}public boolean isValid(char[][] board, int row, int col, char val){// 同行是否重复for (int i = 0; i < 9; i++){if (board[row][i] == val){return false;}}// 同列是否重复for (int j = 0; j < 9; j++){if (board[j][col] == val){return false;}}// 9宫格里是否重复int 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){return false;}}}return true;}}
