• 【初级算法】10.有效的数独


    题目:

    判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
    
    数字 1-9 在每一行只能出现一次。
    数字 1-9 在每一列只能出现一次。
    数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
    
    
    上图是一个部分填充的有效的数独。
    
    数独部分空格内已填入了数字,空白格用 '.' 表示。
    
    示例 1:
    
    输入:
    [
      ["5","3",".",".","7",".",".",".","."],
      ["6",".",".","1","9","5",".",".","."],
      [".","9","8",".",".",".",".","6","."],
      ["8",".",".",".","6",".",".",".","3"],
      ["4",".",".","8",".","3",".",".","1"],
      ["7",".",".",".","2",".",".",".","6"],
      [".","6",".",".",".",".","2","8","."],
      [".",".",".","4","1","9",".",".","5"],
      [".",".",".",".","8",".",".","7","9"]
    ]
    输出: true
    示例 2:
    
    输入:
    [
      ["8","3",".",".","7",".",".",".","."],
      ["6",".",".","1","9","5",".",".","."],
      [".","9","8",".",".",".",".","6","."],
      ["8",".",".",".","6",".",".",".","3"],
      ["4",".",".","8",".","3",".",".","1"],
      ["7",".",".",".","2",".",".",".","6"],
      [".","6",".",".",".",".","2","8","."],
      [".",".",".","4","1","9",".",".","5"],
      [".",".",".",".","8",".",".","7","9"]
    ]
    输出: false
    解释: 除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。
         但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。
    说明:
    
    一个有效的数独(部分已被填充)不一定是可解的。
    只需要根据以上规则,验证已经填入的数字是否有效即可。
    给定数独序列只包含数字 1-9 和字符 '.' 。
    给定数独永远是 9x9 形式的。

    解题思路:

    本题初看起来比较怪异,实际只需要判断数据是否合规即可。数独9*9要求每一列的数据为1到9,每一行的数据为1到9.每一个3*3的block也为数字1到9.

    因此只需要判断列,行,块是否合法即可。具体该数独有没有解不必关心。

    代码:

    class Solution {
    public:
        bool isValidBlock(vector<vector<char>>& board,int x,int y){
            set<int> test;
            for(int i = x;i<x+3;++i){
                for(int j = y;j < y+3;++j){
                    if(board[i][j] == '.'){
                        continue;
                    }
                    if(!(board[i][j] <= '9' && board[i][j] >= '1')){
                        return false;
                    }
                    if(board[i][j] <= '9' && board[i][j] >= '1'){
                        if(test.find(board[i][j]-'0')==test.end()){
                            test.insert(board[i][j]-'0');
                        }else{
                            return false;
                        }
                    }
                }
            }
            
            return true;
        }
        
        bool isValidRow(vector<vector<char>>& board,int row){
            set<int> test;
            for(int i = 0;i < 9;++i){
               if(board[row][i] == '.'){
                   continue;
               }
               if(!(board[row][i] >= '1' && board[row][i] <= '9')){
                   return false;
               }
               if(test.find(board[row][i]-'0')==test.end()){
                   test.insert(board[row][i]-'0');
               }else{
                   return false;
               }
            }
            
            return true;
        }
        
        bool isValidColum(vector<vector<char>>& board,int colum){
            set<char> test;
            for(int i = 0;i<9;++i){
               if(board[i][colum] == '.'){
                   continue;
               }
               if(!(board[i][colum] <= '9' && board[i][colum] >= '1')){
                   return false;
               }
               if(test.find(board[i][colum]-'0')==test.end()){
                   test.insert(board[i][colum]-'0');
               }else{
                   return false;
               }
            }
            
            return true;
        }
        
        bool isValidSudoku(vector<vector<char>>& board) {
            
            /*check row & colum*/
            for(int i = 0; i < 9; ++i){
                if(!isValidRow(board,i)||!isValidColum(board,i)){
                    cout<<i<<endl;
                    return false;
                }
            }
                    
            /*check block*/
            for(int i = 0;i < 9; i += 3){
                for(int j = 0;j < 9; j += 3){
                    if(!isValidBlock(board,i,j)){
                        cout<<i<<j<<endl;
                        return false;
                    }
                }
            }
            
            return true;
        }
    };
  • 相关阅读:
    装饰者模式
    Linux 编译的一些注意参数
    CodeBlocks使用静态链接库
    [BOOST] BOOST::String
    [BOOST] BOOST::Regex
    如何启动仿真环境里的网络联接?
    BlackCore
    Silverlight 中为Dialog添加委托
    c# windows应用程序或C# 控制台应用程序 添加web引用步骤
    Hyperv Server Q&A
  • 原文地址:https://www.cnblogs.com/mikemeng/p/8983761.html
Copyright © 2020-2023  润新知