leetCode之Sudoku Solver
题目链接:https://leetcode.com/problems/sudoku-solver/description/
【题目描述】
Write a program to solve a Sudoku puzzle by filling the empty cells.
Empty cells are indicated by the character '.'.
You may assume that there will be only one unique solution.
![]()
A sudoku puzzle...
![]()
...and its solution numbers marked in red.
【解决思路】
对于这个题,第一眼看到,完全无思路,直接网上找到思路,其实,确实的是分析问题的过程,看到相关答案后,其实发现仅是通过了递归判断而已,这些自己其实是懂的,也有过相关的应用,但是,缺少勇气去分析,默认给自己下了判断,这个题,我分析不出来。
这个和日常工作中,其实是一样的,没有特别的难题是解决不了的,只是缺少操作的实干精神而已。
大概说一下思路吧。
递归的结束条件是:判断某个位置,从1-9填充过之后,没有合适的,证明前边的填充是出现问题的,就需要重新填充。
其中切勿忘记的是3行3列的小方格一定不能忘记校验,这个校验其实还是比较巧妙的,在自己完成的过程中,没有考虑到具体该怎么获取这个位置信息。
【代码实现】
public class Solution { public void solveSudoku(char[][] board) { solve(board); } private boolean solve(char[][] board){ for(int row=0; row<9; row++) { for(int col=0; col<9; col++) { if(board[row][col] == '.') { for(char i='1'; i<='9'; i++) { board[row][col] = i; if(isValid(board, row, col) && solve(board)) { return true; } board[row][col] = '.'; } return false;//通过了前边的判断,发现已经没有解决的方案。证明此数组是没有解决答案的。 } } } return true; } private boolean isValid(char[][] board, int row, int col) { for(int i=0; i<9; i++ ) { if(i != col && board[row][i] == board[row][col]) { return false; } } for(int i=0; i<9; i++ ) { if(row != i && board[i][col] == board[row][col]) { return false; } } int begRow = 3 * (row/3);//这里通过取模计算,比较巧妙的得到了当前所在的小方格的位置 int begCol = 3 * (col/3); for(int i=begRow; i<begRow+3; i++) { for(int j=begCol; j<begCol+3; j++) { if(i!=row && j!=col && board[i][j] == board[row][col]) { return false; } } } return true; } }

浙公网安备 33010602011771号