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;
    }
};
原文地址:https://www.cnblogs.com/hozhangel/p/7847048.html