Задача с простыми правилами, но нетривиальными алгоритмами. :-)
задача
Возьмите ввод в виде разделенных пробелом целых чисел:
N A B S
Где N - длина стороны двумерной квадратной матрицы, заполненной уникальными числами (целыми числами) между A и B включительно. Для каждой строки и столбца в этой матрице сумма всегда одна и та же: S. (Другими словами, матрица представляет собой полумагический квадрат).
Заметка:
Все цифры положительные. Исключение составляет А, которое может быть 0.
Примеры
Для
3 1 10000 2015
правильное решение будет
Для
8 1 300 500
правильное решение будет
Выход
Ваш вывод должен быть таблицей ASCII. Пример для первого примера выше:
384 159 1472
1174 499 342
457 1357 201
Выровненные вправо целые числа, дополненные пробелами. Ширина каждого столбца - это ширина наибольшего целого числа в этом столбце.
счет
Это код-гольф , поэтому выигрывает самый короткий код в байтах. Применяются стандартные лазейки (особенно встроенные для решения этой проблемы). Вам не нужно заботиться о неправильных или иным образом невозможных входах (включая отрицательные числа). Пожалуйста, предоставьте пример вывода в вашем ответе (обязательно) для второго примера выше.
A
,B
иN
может быть отрицательным?Ответы:
CJam,
11991 байтЭто доказуемо правильный, недетерминированный подход.
На моем рабочем столе второй тестовый пример обычно заканчивается менее чем за 10 минут.
Первый случай заканчивается мгновенно. Попробуйте онлайн в интерпретаторе CJam .
Пробный прогон
идея
Без ограничений по времени мы могли бы просто генерировать квадраты случайным образом, пока не нашли правильный квадрат. Этот подход основывается на этой идее, добавляя две оптимизации:
Вместо псевдослучайного генерирования квадрата длины стороны N , мы генерируем квадраты длины стороны N-1 , добавляем один столбец, чтобы сформировать прямоугольник N × (N-1) , строки которого имеют сумму S , затем одну строку, чтобы сформировать квадрат длина стороны Н , столбцы которой есть сумма S .
Так как сумма элементов всех столбцов будет NS и сумма элементов первых N-1 строк (N-1) S , последняя строка будет также иметь сумму S .
Однако этот процесс может генерировать недопустимую матрицу, поскольку нет гарантии, что все элементы последней строки и столбца будут уникальными или попадут в диапазон [A ... B] .
Выбор квадрата уникальных целых чисел в [A ... B] и длины стороны N-1 равномерно случайным образом занял бы слишком много времени. Мы как-то должны расставить приоритеты для квадратов, которые имеют более высокий шанс получить действительный квадрат с длиной стороны N после применения процесса, описанного в предыдущем пункте.
Принимая во внимание , что каждая строка и столбец должен иметь сумму S , его элементы имеют в среднем S / N . Таким образом, выбор большего количества элементов, близких к этому среднему, должен увеличить наши шансы.
Для каждого I в [A ... B] мы псевдослучайно выбираем число с плавающей точкой между 0 и (I - S / N) 2 + 1 и сортируем элементы [A ... B] по выбранным числам с плавающей точкой. Мы сохраняем первые N 2 числа и помещаем их в порядке чтения в квадрат.
Предполагая, что на каждом шаге абсолютно равномерное распределение всех действительных чисел между 0 и (I - S / N) 2 + 1 , все квадраты имеют ненулевую вероятность выбора, что означает, что процесс в конечном итоге завершится.
Код
источник