https://oj.leetcode.com/problems/valid-sudoku/ Проблема должен был определить, является ли судоку действительным или нет
Чтобы решить эту задачу, нужно проверить только 3 правила, как указано в задаче.
В каждой строке числа от 1 до 9 должны встречаться только один раз.
В каждом столбце числа от 1 до 9 должны встречаться только один раз.
- А числа от 1 до 9 должны встречаться только один раз в каждом из 9 подблоков сетки.
Поэтому я немного подумал и пришел к решению, похожему на это: это не имело большого значения, поскольку сначала выполнялся хеш для строки, затем хеш сохранялся для столбца и, наконец, для подматрицы.
class Solution {
public:
bool isValidSudoku(vector<vector<char> > &board) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
map<char, bool> row;
map<char, bool> col;
map<char, bool> block;
for (int i=0;i<9;i++){
col.clear();
row.clear();
for (int j=0;j<9;j++){
if (board[i][j]!='.'){
if (col[board[i][j]]){
return false;
}else{
col[board[i][j]]=true;
}
}
if (board[j][i]!='.'){
if (row[board[j][i]]){
return false;
}else{
row[board[j][i]]=true;
}
}
}
}
for (int ii=0;ii<9;ii=ii+3){
for (int jj=0;jj<9;jj=jj+3){
block.clear();
for (int i=ii;i<ii+3;i++){
for (int j=jj;j<jj+3;j++){
if (board[i][j]!='.'){
if (block[board[i][j]]){
return false;
}else{
block[board[i][j]]=true;
}
}
}
}
}
}
return true;
}
};
Однако позже я просмотрел некоторые коды и нашел это:
Class Solution
{public:
bool isValidSudoku(vector<vector<char> > &board) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
vector<vector<bool> > rows(9, vector<bool>(9, false));
vector<vector<bool> > cols(9, vector<bool>(9, false));
vector<vector<bool> > blocks(9, vector<bool>(9, false));
for (int i = 0; i < 9; ++i) {
for (int j = 0; j < 9; ++j) {
if (board[i][j] == '.') continue;
int c = board[i][j] - '1';
if (rows[i][c] || cols[j][c] || blocks[i - i % 3 + j / 3][c])
return false;
rows[i][c] = cols[j][c] = blocks[i - i % 3 + j / 3][c] = true;
}
}
return true;
}
};
Как вы можете видеть, это довольно аккуратное решение, но поразительной частью для меня было «блоки [i - i % 3 + j / 3] [c]». Мой вопрос в том, как вы делаете такое выражение «i - i % 3 + j / 3" для подмассива? Насколько мне известно, не существовало общей формулы для доступа к матрице 3X3 из 9x9. Если бы кто-то мог дать общие правила для создания таких аккуратных кодов, я был бы более чем счастлив.