#include<vector>
#include<iostream>
#include<cstring> //cao,string!初始化字符
using namespace std;
/*
* 使用hash映射:
* hang[i][j] 表示第i行出现数字j的次数
* lie[i][j] 表示第i列出现数字j的次数
* san[i][j][k]表示3*3的单元格中出现数值k的次数,一次遍历
*/
bool isValidSudoku(vector<vector<char> >& board) {
int hang[9][10];
int lie[9][10];
int san[3][3][10];
int temp;
memset(hang, 0, sizeof(hang)); //直接初始化,不需要对列再对行初始化
memset(lie,0,sizeof(lie));
memset(san, 0, sizeof(san));
bool flag=true; //默认可以
for(int i=0;i<9;++i)
{
for(int j=0;j<9;++j)
{
if(board[i][j]!='.'){
temp=board[i][j]-'0'
hang[i][temp]++;
lie[j][temp]++;
san[i/3][j/3][temp]++;
if(hang[i][temp]>1||lie[j][temp]>1||san[i/3][j/3][temp]>1) return false;
} //注意数组的存储范围0~9 ,所以我们开[i][10]个数组空间,以防止越界情况出现
}
}
return true;
}
题目链接: 力扣
思路:使用hash表映射每一个数字出现的次数,hang[i][temp]表示第i行出现数字为temp的次数,lie[i][temp]同理,san[i][j][k]表示3*3的单元格中第i行,j列个单元格中数值为k出现的次数.
最后有一点要注意:
因为我们存储的数值为0~9,所以我们要开9*10的数组,而不是9*9的数组.当然大家也可以通过-1操作来自行修改.
1261

被折叠的 条评论
为什么被折叠?



