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;
    }
}

 

posted @ 2018-02-23 10:09  woniu4  阅读(21)  评论(0)    收藏  举报