题目
算法
- 这道题的要求是检验题目给出的九宫格是否有效,只需要检测给出的数字就可以了
- 算法主要需要验证横向,纵向,子宫格是否有重复数字,可以分为三次遍历,也可以一次遍历
- 可以利用公式
i
n
d
e
x
=
(
i
/
3
)
∗
3
+
j
/
3
index=(i/3)*3+j/3
index=(i/3)∗3+j/3来表示每一个3x3子宫格的下标,(图是盗的)
- 这样检查横向的数字是否重复需要9个哈希表(或数组,因为这道题关键字是连续的数字),检查纵向需要9个哈希表(或数组),检查子宫格需要9个哈希表(或数组)
- 对每一个出现的数字,找到其对应的子宫格,行,列分别对应的哈希表,对应的值加1,每次加一后检查如果哈希表对应的值大于一,则这个九宫格是无效的
AC代码(c++)
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
unordered_map<int,int> xbel[9];//横向9个哈希表
unordered_map<int,int> ybel[9];//纵向9个哈希表
unordered_map<int,int> boxes[9];//子宫格9个哈希表
//两个for循环对九宫格棋盘进行一次遍历
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
{
char num=board[i][j];
if(num!='.')
{
int boxindex=(i/3)*3+j/3;
xbel[i][num]++;//对应的横向哈希表
ybel[j][num]++;//对应的纵向哈希表
boxes[boxindex][num]++;//对应的子宫格哈希表
if(xbel[i][num]>1||ybel[j][num]>1||boxes[boxindex][num]>1)//每一次添加后的检测
return false;
}
}
return true;
}
};
遇到问题
num!=’.‘和num!=".“的区别,如果按照第二个写,会报错
[Error] ISO C++ forbids comparison between pointer and integer [-fpermiss
原因:”."表示字符串的首地址,’.'表示字符
参考博客