Problem : 解决数独问题,给出一个二维数组,将这个数独进行求解。
思路:
- 嵌套循环,三层循环体,每一行,每一列,填入从1到9的数字。判断填入之后是否合理
- 判断数独是否合理的函数
参考代码:
package leetcode_50; /*** * * @author pengfei_zheng * 求解数独问题 */ public class Solution37 { public static void solveSudoku(char[][] board) { if(board==null ||board.length ==0) return; else solve(board); } private static boolean solve(char[][] board) { for(int i = 0 ; i < 9;i++){ for(int j = 0 ; j < 9;j++){ if(board[i][j]=='.'){ for(char c = '1'; c<='9';c++){ if(isValid(board,i,j,c)){ board[i][j]=c; if(solve(board)) return true; else board[i][j]='.'; } } return false; } } } return true; } private static boolean isValid(char[][] board, int row, int column, char c) { for(int i = 0 ; i < 9; i ++){ if(board[row][i]==c) return false; if(board[i][column]==c) return false; if(board[3 * (row / 3) + i / 3][ 3 * (column / 3) + i % 3] != '.' && board[3 * (row / 3) + i / 3][3 * (column / 3) + i % 3] == c) return false; //check 3*3 block } return true; } public static void main(String[]args){ long start = System.currentTimeMillis(); char[][] board={{'8','.','.','.','.','.','.','.','.'}, {'.','.','3','6','.','.','.','.','.'}, {'.','7','.','.','9','.','2','.','.'}, {'.','5','.','.','.','7','.','.','.'}, {'.','.','.','.','4','.','7','.','.'}, {'.','.','.','1','.','5','.','3','.'}, {'.','.','1','.','.','.','.','6','8'}, {'.','.','8','5','.','.','.','1','.'}, {'.','9','.','.','.','.','4','.','.'} }; solveSudoku(board); long end = System.currentTimeMillis(); for(int i = 0 ; i < 9 ; i ++){ for(int j = 0 ; j < 9 ;j ++){ System.out.print(board[i][j]+" "); } System.out.println(); } System.out.println("耗时: "+ (double)(end-start)/1000+" s"); } }