题目描述: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.
分析:此题是要判断一个数独是否是有效的。有效的条件是:
1) 每一行1-9之间的数字最多只出现一次;
2) 每一列1-9之间的数字最多只出现一次;
3) 每一个九宫格中1-9之间的数字最多只出现一次,
题意很直白,只需要判断是否满足以上三个条件,若均满足,则视为valid。
以下是C++实现代码:
class Solution {
public:
bool markUsed(vector<char> vec) /* 判断是否只包含1-9,且每个数最多只出现一次,若是,则返回true */
{
int mark[10] = {0};
vector<char>::iterator itr;
for(itr=vec.begin(); itr != vec.end();itr++)
{
if(*itr != '.')
{
if((*itr - '0' > 0 && *itr-'0' <10))
++mark[*itr - '0'];
}
if(mark[*itr - '0'] > 1)
return false;
}
return true;
}
bool isValidSudoku(vector<vector<char> > &board) {
/* rows:判断每行是否只包含1-9之间的数最多一次 */
vector<vector<char>>::iterator iter;
for(iter = board.begin(); iter != board.end(); iter++)
{
if( !markUsed(*iter)) /*每一行判断,若不满足条件,则立即退出,返回false */
return false;
}
/*colum:判断每列是否只包含1-9之间的数最多一次 */
for(int i = 0; i < 9;i++)
{
vector<char> tmpv;
for(int j = 0;j < 9; j++)
{
tmpv.push_back(board[j][i]);
}
if(!markUsed(tmpv)) /*每一列判断,若不满足条件,则立即退出,返回false */
return false;
}
/* each block:判断每个9宫格是否只包含1-9之间的数最多一次 */
for(int k = 0; k < 3; k++) /* 行号分成3块,每块大小为3 */
{
for(int h = 0; h < 3; h++) /*列号分为3块,没块大小为3*/
{
vector<char> tmpv;
for(int row = k * 3; row < k * 3 + 3; row++) /* 行 */
{
for(int col = h * 3; col < h * 3 + 3; col++) /* 列 */
{
tmpv.push_back(board[row][col]);
}
}
if(!markUsed(tmpv)) /* 每一个九宫格判断,若不满足条件,则立即退出,返回false */
return false;
}
}
return true;
}
};