题目:数独填写正确判断
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; } };