Как мне очистить эти вложенные циклы?

0

ПРИМЕЧАНИЕ. Неверный код впереди. Вас предупредили.

Этот код повторяется через все элементы во всех квадратах 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]
                        }
                    }
                }
            }

        }
    }
}
Теги:

1 ответ

1

Вы внедрили что-то, называемое "Исчерпывающий поиск", в котором, по существу, исследуется все возможные комбинации квадратов.

  1. Слышали ли вы о чем-то, что называется " разматывание цикла"?

    → Вместо 5 вложенных циклов For используют несколько вложенных циклов несколько раз; что-то вроде 2 вложенных циклов.

  2. Используйте подход с динамическим программированием, который, вероятно, O (n ^ 2)

Пример верхнего Coder DP.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню