OlegWock
@OlegWock
Python, Java+Android, Frontend

Какой алгоритм использовать в этой задаче?

Сегодня на олимпиаде была задача. Я ее успешно завалил, но до сих пор интересно как ее решать. Вот сама задача:
Есть числовые значения n, k, s.
n = 2..64
2 <= k <= n
s = 1..k^2
Нужно создать матрицу n*n элементов и расположить ноли и единицы так, что бы в любом квадрате размера k*k было ровно s единиц.

Единственным моим предположением было написать функцию, которая проверяет, соответствует ли масив правилам (что я и сделал) и потом прогнать через нее все возможные варианты, но я понимаю что это не эффективно. Да и у меня не получилось получить все варианты массива.
  • Вопрос задан
  • 496 просмотров
Пригласить эксперта
Ответы на вопрос 3
OlegWock
@OlegWock Автор вопроса
Python, Java+Android, Frontend
Пока ждал, нагуглил сам.
Это задача на идею. Когда ее знаешь, то решение кажется очевидным. Однако придумать такое
решение самому иногда (а точнее даже очень часто) не так-то просто. Раскроем секрет задачи:
достаточно сгенерировать любой квадрат K*K, содержащий ровно S единиц, а затем просто заполнить
им квадрат N*N.

Подробнее (+ код на паскале): тыц
Ответ написан
Комментировать
@di23
Ну уже вы сами нашли ответ. Однако если вам хочется что-бы "узор" из единиц и нулей не повторялся примитивно, как в вашем решении, то стоит делать следующим образом:
1. Создать пустую матрицу n*n.
2. В начале координат заполнить рандомно квадрат k*k единицами в кол-ве S.
3. Сместить квадрат k*k на одну клетку.
4. Проверить кол-во единиц в квадрате.
5. Добавить необходимое кол-во единиц в новые клетки, так что бы их было S. Опять же распределив их рандомно.
6. Повторять пункты 3-5 пока матрица n*n не закончится.
7. Профит!!!
Таким образом получаем матрицу n*n с уникальным и не повторяющимся рисунком.
Ответ написан
А почему бы просто не начать заполнять с левого верхнего угла? Ну то есть в первом квадрате проставляем рандомно, а дальше ставим. Куда бы мы не сместились ( вниз или вправо на ряд) - попасть в безвыходную ситуацию мы не можем, а значит и проблем возникнуть не может. Для ускорения стоит использовать вычисления на предыдущих шагах.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы