zoukankan      html  css  js  c++  java
  • 36. Valid Sudoku数独判断

    题目:数独填写正确判断

    https://leetcode.com/problems/valid-sudoku/description/

    Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.

    The Sudoku board could be partially filled, where empty cells are filled with the character '.'

    A partially filled sudoku which is valid.

    Note:
    A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.(数独全部完成或部分完成)

    题意是:

      比如一个人在玩数独游戏,他只填写了一部分或全部完成。

      程序的目的是:检查在目前,不管是否完成,已经填写的数独填写是否正确(行、列、区块中每个数字均不能重复)。

      什么是区块?看下图任意三行三列组成的九格是一个区块:

    解决方法:

    程序中为判断数独是否填写正确,用三个二维数组分别标记行、列、区块:
    
    row[i][num]: 在i行,num是否已经存在,存在的话row[i][num] = 1;
    
    col[j][num]: 在j列,num是否已经存在  
    
    block[k][num]: 在k区块,num是否已经存在  
    
    注意区块k的计算方法:
    例如在i行j列的一个数,它属于的区块是:k = i / 3 * 3 + j / 3;
    

      程序如下:

    class Solution {
    public:
        bool isValidSudoku(vector<vector<char> > &board)
        {
            int row[9][9] = {0}, col[9][9] = {0}, block[9][9] = {0};
            
            for(int i = 0; i < board.size(); ++ i)   //
                for(int j = 0; j < board[i].size(); ++ j)  //
                    if(board[i][j] != '.')  //空的地方被标记为‘.’
                    { 
                        int num = board[i][j] - '0' - 1;  //当前数是多少
                        int k = i / 3 * 3 + j / 3;   //属于哪个小方格。(把一个位置的行(i)列(j)如此计算之后就可以得到它属于哪个block)
                        if(row[i][num] || col[j][num] || block[k][num])  //如果在某行,某列,某个区块这个数已经存在,那么返回false
                            return false;
                        row[i][num] = col[j][num] = block[k][num] = 1;   //标记这个数在这个行,列区块是存在的,
                    }
            return true;
        }
    };
  • 相关阅读:
    如何实时抓取动态网页数据?
    产品经理面试——简历填写
    项目章程
    IDEA 必要配置
    项目章程
    基础知识02 零基础入门学习汇编语言02
    基础知识03 零基础入门学习汇编语言03
    进制转换教程
    基础知识04 零基础入门学习汇编语言04
    基础知识01 零基础入门学习汇编语言01
  • 原文地址:https://www.cnblogs.com/hozhangel/p/7847048.html
Copyright © 2011-2022 走看看