首页 > 其他 > 详细

Valid Sudoku -- LeetCode

时间:2014-03-11 09:09:53      阅读:557      评论:0      收藏:0      [点我收藏+]
原题链接: http://oj.leetcode.com/problems/valid-sudoku/ 

这道题是Sudoku Solver的一个子问题,在解数独的时候我们需要验证当前数盘是否合法。其实思路比较简单,也就是用brute force。对于每一行,每一列,每个九宫格进行验证,总共需要27次验证,每次看九个元素。所以时间复杂度就是O(3*n^2), n=9。代码如下: 

public boolean isValidSudoku(char[][] board) {
    if(board==null || board.length!=9 || board[0].length!=9)
        return false;
    for(int i=0;i<9;i++)
    {
        boolean[] map = new boolean[9];
        for(int j=0;j<9;j++)
        {
            if(board[i][j] != ‘.‘)
            {
                if(map[(int)(board[i][j]-‘1‘)])
                {
                    return false;
                }
                map[(int)(board[i][j]-‘1‘)] = true;
            }
        }
    }
    for(int j=0;j<9;j++)
    {
        boolean[] map = new boolean[9];
        for(int i=0;i<9;i++)
        {
            if(board[i][j] != ‘.‘)
            {
                if(map[(int)(board[i][j]-‘1‘)])
                {
                    return false;
                }
                map[(int)(board[i][j]-‘1‘)] = true;
            }
        }
    }        
    for(int block=0;block<9;block++)
    {
        boolean[] map = new boolean[9];
        for(int i=block/3*3;i<block/3*3+3;i++)
        {
            for(int j=block%3*3;j<block%3*3+3;j++)
            {
                if(board[i][j] != ‘.‘)
                {
                   if(map[(int)(board[i][j]-‘1‘)])
                   {
                      return false;
                   }
                   map[(int)(board[i][j]-‘1‘)] = true;    
                }
            }
        }
    }
    return true;
}
这道题其实没有什么好的算法,基本上就是遍历去检查,实现上就是数组的操作,属于Sudoku Solver的subroutine,但是在Sudoku Solver中实现上又可以进行优化,没必要每次检查整个board,只需要看当前加进去的数就可以,有兴趣的朋友可以看看哈。

Valid Sudoku -- LeetCode,布布扣,bubuko.com

Valid Sudoku -- LeetCode

原文:http://blog.csdn.net/linhuanmars/article/details/20748171

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!