题意理解
判断数独是否有效,横,纵,方块三个要求都满足1-9。
问题分析
bool isValidSudoku(vector<vector<char>>& board) {
bool h[9][9] = {}; //横向记录数字是否重复重现
bool v[9][9] = {}; //纵向
bool b[9][9] = {}; //方块
for (int i = 0; i != 9; i ++)
{
for (int j = 0; j != 9; j ++)
{
if (board[i][j] == '.')
{
continue;
}
int num = board[i][j] - '1'; //当前数字
int k = i / 3 * 3 + j / 3; //方块位置
if (h[i][num] || v[j][num] || b[k][num]) //只要三种情况相同的数字出现过
{
return false; //判无效
}
h[i][num] = true; //没出现过,对应的数字置为true
v[j][num] = true; //同上
b[k][num] = true; //同上
}
}
return true;
}
方法2
for(int i = 0; i != 9; i ++) //横向
{
map<char,int> dict;
for(int j = 0; j != 9; j ++)
{
dict[board[i][j]]++;
if (dict[board[i][j]] > 1 && board[i][j] != '.')
{
cout << "h:" << '\t' << i << '\t' << j << '\t' << board[i][j] << endl;
return false;
}
}
}
for(int j = 0; j != 9; j ++) //纵向
{
map<int,int> dict;
for(int i = 0; i != 9; i ++)
{
dict[board[i][j]]++;
if (dict[board[i][j]] > 1 && board[i][j] != '.')
{
cout << "v:" << '\t' << i << '\t' << '\t' << board[i][j] << endl;
return false;
}
}
}
for(int k = 0; k != 9; k ++) //方块
{
map<int, int> dict;
for(int i = k % 3 * 3; i != k % 3 * 3 + 3; i ++)
{
for (int j = k / 3 * 3; j != k / 3 * 3 + 3; j ++)
{
dict[board[i][j]]++;
if (dict[board[i][j]] > 1 && board[i][j] != '.')
{
cout << "b:" << '\t' << i << '\t' << j << board[i][j] << endl;
return false;
}
}
}
}
return true;
}
其他
链接