Valid Sudoku
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, 每一行要不同
2, 每一列要不同
3, 每一个子格子不要同(图中粗线隔开) 解法:利用二进制状态压缩方法分别记录每一行,第一列和9个小格子的压缩值,这二进制状态就是,一个整数有32位,我们用后面10位来表示数字0到9,也就是说如果第2位为1,那么说明2有出现,第3位为1,3就有出现,如果哪一位出现了不只一次,就说明有冲突了,不是一个合法的数独.怎么判断有没有出现呢,利用位运算&,如果(i&(1<< j))>0则有出现(数i第j位为1),我们把出现的数加到要记录值上面也是利用位运算|,i=i|(1<< j)把i第j位置为1,具体位运算的使用和状态压缩,网上有很多教程.有兴趣可以看看.只是简单的解决这里的问题可以直接看代码.
class Solution {
public:
//char:'1'~'9'.
//return: 2^(1~9);
int powerByChar(char ch) {
return 1 << (ch - '0');
}
//riBlock:引用.
bool addCharacterToBlock(char ch, int &riBlock) {
if ('.' == ch) return true;
if (riBlock & powerByChar(ch)) return false;
riBlock |= powerByChar(ch);
return true;
}
bool isValidSudoku(vector<vector<char>>& board) {
bool bResult = true;//初始化成true,一旦有不成立的就成false.
int iBlocks[10] = {0};//9个小正方形.
int iColumn[10] = {0};//9列
int iRow = 0;//每一行.
for (int i = 0; i < 9 && bResult; ++i) {
iRow = 0;//把一行初始化成0.
for (int j = 0; j < 9 && bResult; ++j) {
bResult &= addCharacterToBlock(board[i][j], iRow);
bResult &= addCharacterToBlock(board[i][j], iColumn[j]);
bResult &= addCharacterToBlock(board[i][j], iBlocks[i / 3 * 3 + j / 3]);
}
}
return bResult;
}
};
欢迎访问我的github,我的leetcode持续更新: https://github.com/tsfissure/LeetCode