51. N 皇后

  • java的字符串不太好用,需要注意很多细节

    1. class Solution {
    2. List<List<String>> res = new ArrayList<>();
    3. public List<List<String>> solveNQueens(int n) {
    4. char[][] chessboard = new char[n][n];
    5. for (char[] row : chessboard) {
    6. Arrays.fill(row, '.');
    7. }
    8. backtrack(n, 0, chessboard);
    9. return res;
    10. }
    11. public void backtrack(int n, int row, char[][] chessboard) {
    12. if (row == n) {
    13. res.add(Array2List(chessboard));
    14. return;
    15. }
    16. for (int col = 0; col < n; ++col) {
    17. if (isValid(chessboard, row, col, n)) {
    18. chessboard[row][col] = 'Q';
    19. backtrack(n, row + 1, chessboard);
    20. chessboard[row][col] = '.';
    21. }
    22. }
    23. }
    24. public List<String> Array2List(char[][] chessboard) {
    25. List<String> list = new ArrayList<>();
    26. for (char[] row : chessboard) {
    27. list.add(new String(row));
    28. }
    29. return list;
    30. }
    31. public boolean isValid(char[][] chessboard, int row, int col, int n) {
    32. // 检查列
    33. for (int i=0; i<row; ++i) { // 相当于剪枝
    34. if (chessboard[i][col] == 'Q') {
    35. return false;
    36. }
    37. }
    38. // 检查45度对角线
    39. for (int i=row-1, j=col-1; i>=0 && j>=0; i--, j--) {
    40. if (chessboard[i][j] == 'Q') {
    41. return false;
    42. }
    43. }
    44. // 检查135度对角线
    45. for (int i=row-1, j=col+1; i>=0 && j<=n-1; i--, j++) {
    46. if (chessboard[i][j] == 'Q') {
    47. return false;
    48. }
    49. }
    50. return true;
    51. }
    52. }

    37. 解数独

  • return false;没有终止条件也不会因为填不满棋盘而无限递归下去

    1. class Solution {
    2. public void solveSudoku(char[][] board) {
    3. backtrack(board);
    4. }
    5. //选择一个符合条件的路径即可,则有返回值
    6. public boolean backtrack(char[][] board) {
    7. for (int i = 0; i < board.length; ++i) {
    8. for (int j = 0; j < board[0].length; ++j) {
    9. if (board[i][j] != '.') {
    10. continue;
    11. }
    12. for (char k = '1'; k <= '9'; ++k) {
    13. if (isValid(board, i, j, k)) {
    14. board[i][j] = k;
    15. if (backtrack(board)) {
    16. return true;
    17. }
    18. board[i][j] = '.';
    19. }
    20. }
    21. return false; //关键,9个数都不行,则直接数独无解
    22. }
    23. }
    24. return true;
    25. }
    26. public boolean isValid(char[][] board, int row, int col, char val){
    27. // 同行是否重复
    28. for (int i = 0; i < 9; i++){
    29. if (board[row][i] == val){
    30. return false;
    31. }
    32. }
    33. // 同列是否重复
    34. for (int j = 0; j < 9; j++){
    35. if (board[j][col] == val){
    36. return false;
    37. }
    38. }
    39. // 9宫格里是否重复
    40. int startRow = (row / 3) * 3;
    41. int startCol = (col / 3) * 3;
    42. for (int i = startRow; i < startRow + 3; i++){
    43. for (int j = startCol; j < startCol + 3; j++){
    44. if (board[i][j] == val){
    45. return false;
    46. }
    47. }
    48. }
    49. return true;
    50. }
    51. }