zoukankan      html  css  js  c++  java
  • lintcode:Valid Sudoku 判断数独是否合法

    题目:

    判断数独是否合法

    请判定一个数独是否有效。该数独可能只填充了部分数字,其中缺少的数字用 . 表示。
    样例
    下列就是一个合法数独的样例。
    注意 一个合法的数独(仅部分填充)并不一定是可解的。我们仅需使填充的空格有效即可。
    说明
    什么是 数独?
    http://sudoku.com.au/TheRules.aspx
    http://baike.baidu.com/subview/961/10842669.htm
    解题:
    感觉这很难到不知道如何进行,在这里看到,只需判断每行,每类,每个小3*3矩阵内的数字是1-9就是合法的,但是这里只填充部分数的,按照上面说,没有填充的数 认为是该位置是合法的,这里的程序,也是这样搞的,感觉这不对头,但是意思是说:只要部分填充的数独满足了数独的条件,一定能填充成数独。<正确与否,我不确定,但是程序就是这样写的,逆推的结论>
    Java程序:
     
    class Solution {
        /**
          * @param board: the board
            @return: wether the Sudoku is valid
          */
        public boolean isValidSudoku(char[][] board) {
            boolean[] visited = new boolean[9];
            //row 
            for(int i=0;i<9;i++){
                Arrays.fill(visited,false); //填充visited数组中的每个元素都是false 
                for(int j=0;j<9;j++){
                    if(!process(visited,board[i][j]))
                        return false;
                }
            }
            
            //col
            for(int i=0;i<9;i++){
                Arrays.fill(visited,false);
                for(int j=0;j<9;j++)
                    if(!process(visited,board[j][i]))
                        return false;
            }
            //sub matrix
            for(int i=0;i<9;i+=3)
                for(int j=0;j<9;j+=3){
                    Arrays.fill(visited,false);
                    for(int k = 0;k<9;k++)
                        if(!process(visited,board[i+ k/3][j + k%3]))
                            return false;
                }
            return true;
        }
        private boolean process(boolean[] visited,char dight){
            if(dight=='.')
                return true;
            int num = dight - '0';
            if(num<1 || num>9 || visited[num-1])
                return false;
            visited[num-1] = true;
            return true;
        }
    };
    View Code

    总耗时: 822 ms

    Python程序:

    class Solution:
        # @param board, a 9x9 2D array
        # @return a boolean
        def isValidSudoku(self, board):
            
            # sub matrix
            for i in range(0,9,3):
                for j in range(0,9,3):
                    visited = [False]*9
                    for k in range(3):
                        m = i + k 
                        n = j + k 
                        if(self.process(visited,board[m][n])==False):
                            return False 
                            
            # row
            for i in range(9):
                visited = [False]*9
                for j in range(9):
                    if(self.process(visited,board[i][j])==False):
                        return False
                        
            # col
            for j in range(9):
                visited = [False]*9
                for i in range(9):
                    if(self.process(visited,board[i][j])==False):
                        return False
            
            return True
            
            
        def process(self,visited,digit):
            if digit=='.':
                return True
            num = int(digit)
            if(num<1 or num>9 or visited[num-1]==True):
                return False
            visited[num-1] = True
            return True
    View Code

    总耗时: 148 ms

    在判断3*3矩阵时候,根据我的这样方法很简单的哦

    还有就是直判断行和列是否满足条件也能AC

    所以我把判断小矩阵是否1-9组成放在了最上面

  • 相关阅读:
    zabbix添加自定义监控项
    文件的时间属性(摘自网友的博客)
    svn从Windows服务器上迁移到Linux上
    modelsim 保存波形文件
    Viso Professional 2013版本激活(office 系列产品 -- visio 2013 / project 2013 破解工具
    kindle paperwhite3 连不上WIFI解决方法
    TotoiseSVN的基本使用方法
    SVN 版本服务器搭配全过程详解(含服务端、客户端)
    modelsim读写TXT文件
    如何对多个文件进行MODELSIM仿真? (由于是一个很大的项目,不可能把所有MODULE都放在一个文件里。 如何在ModelSim中对多个.V文件进行仿真?)
  • 原文地址:https://www.cnblogs.com/theskulls/p/4869025.html
Copyright © 2011-2022 走看看