ПРИМЕЧАНИЕ. Неверный код впереди. Вас предупредили.
Этот код повторяется через все элементы во всех квадратах 3x3 в головоломке Sudoku. Способ, показанный ниже, состоит в том, что он получает координату верхнего левого элемента для каждого квадрата, затем выполняет итерацию через каждый элемент этого квадрата. Это означает, что будет всего 4 "для" циклов, необходимых для доступа к правильному индексу, а затем еще один цикл "для", чтобы выполнить правильное действие.
Этот код будет работать (если бы убранный код был вставлен), но он выглядит очень грязным и его очень трудно прочитать. Есть ли лучший способ сделать это, что устраняет эти вложенные циклы for?
Заранее спасибо.
void Sudoku::updateSquares(int grid[9][9], int possibleSolutions[9][9][10])
{
for (int i = 0; i < 9; i += 3)
{
for (int j = 0; j < 9; j += 3) //for every square:
{
//Other code
//...
//Other code
//updates the possibleSolutions array
for (int k = 0; k < 3; k++)
{
for (int l = 0; l < 3; l++) //for every element in every square:
{
if(grid[i+k][j+l] != 0)
continue;
for (int n = 0; n < 10; n++)
{
if(possibleSolutions[i+k][j+l][n] != 0 && numbers[n] == 0)
{
possibleSolutions[i+k][j+l][n] = 0;
possibleSolutions[i+k][j+l][0] -= 1; //reduce the size, which is held in [][][0]
}
}
}
}
}
}
}
Вы внедрили что-то, называемое "Исчерпывающий поиск", в котором, по существу, исследуется все возможные комбинации квадратов.
Слышали ли вы о чем-то, что называется " разматывание цикла"?
→ Вместо 5 вложенных циклов For используют несколько вложенных циклов несколько раз; что-то вроде 2 вложенных циклов.
Используйте подход с динамическим программированием, который, вероятно, O (n ^ 2)