Пять цифр в сетке 5x5

|---|---|---|---|---|
| 1 | 1 | 3 | 5 | 1 |
|---|---|---|---|---|
| 3 | 3 | 2 | 0 | 3 |
|---|---|---|---|---|
| 3 | 0 | 3 | 2 | 3 |
|---|---|---|---|---|
| 1 | 4 | 0 | 3 | 3 |
|---|---|---|---|---|
| 3 | 3 | 3 | 1 | 1 |
|---|---|---|---|---| 

(рисунок 1)

На рисунке 1 показан квадрат. Каждая строка, каждый столбец и две диагонали могут считаться пятизначным простым числом. Строки читаются слева направо. Колонки читаются сверху вниз. Обе диагонали читаются слева направо. Используя данные в файле INPUT.TXT, напишите программу, которая построит такие квадраты.

Простые числа должны иметь одну и ту же цифру (11 в примере). Цифра в верхнем левом углу квадрата предварительно определена (1 в примере).

Простое число может использоваться более одного раза в одном квадрате.

Если есть несколько решений, все должны быть представлены. Пятизначное простое число не может начинаться с нулей, т.е. 00003 НЕ является пятизначным простым числом.

Входные данные

11 1

Я пытаюсь задать вопрос из конкурса IOI'94 - проблема 3 - The Primes.

Я создал большую часть вспомогательных функций...

  • Используется сито из Eratoshenes для генерации 5-значных простых чисел (между 9999 и 100000).
  • Построена функция вычисления суммы цифр (12345 = 1 + 2 + 3 + 4 + 5 = 15)
  • Построена функция проверки массива, если сумма цифр одинакова во всех
  • Построена функция, чтобы проверить, начинается ли число с указанной цифрой (startWith (12345,1) возвращает true)

Вопрос: Проблема в том, что я не знаю, как заполнить массив или использовать функцию обратного отслеживания, чтобы продолжать проверять:( Может ли кто-нибудь мне помочь? Как я могу заполнить 2D-массив, чтобы он содержит значения из основной таблицы, и сумма правильна для всего угла?

* NB: метод решета Eratosthenes, который генерирует 5-значный штрих, а также возможность фильтровать значения, начинающиеся с X, и значения суммируются до M *

Задать вопрос: http://olympiads.win.tue.nl/ioi/ioi94/contest/day1prb3/problem.html

Предполагаемый порядок добавления значений, просто не знаю, как это сделать: (.

 1  2  3  4  5
 6 13 14 12 15
 7 16 11 18 19
 8 10 20 22 23
 9 17 21 24 25

Ответы

Ответ 1

Из того, что вы пишете, я предполагаю, что у вас есть список из 5 цифр простых чисел. Отфильтруйте список так, чтобы он содержал только простые числа с правильной суммой цифр.

Вам понадобится функция, действительная для проверки допустимого квадрата, заданного от 1 до 5 чисел, которые идут в столбцах. (Ясно, что номера столбцов определяют другие строки и диагонали. Итак, если 3-я цифра 1-го столбца равна 7, но нет простого числа, которое начинается с 7, мы знаем, что мы не можем использовать это простое число в первый столбец. Не смотря на все остальные цифры, это рано обрезает ваше дерево поиска.)

Вам нужна другая функция для получения наборов всех действительных простых чисел, имеющих определенную цифру в позиции n (1..5). Возможно, вы хотите предварительно просчитать это и сохранить его в каком-либо дереве или массиве.

Основная работа выполняется в действии, которая должна проверять, существуют ли простые числа для строк и диагоналей с цифрами в позициях, определенных до сих пор штрихами в столбцах.

Тогда список решений:

[ (c1, c2, c3, c4, c5) | c1 <- primes, valid [c1], 
      c2 <- primes, valid [c1,c2],
      c3 <- primes, valid [c1,c2,c3],
      c4 <- primes, valid [c1,c2,c3,c4],
      c5 <- primes, valid [c1,c2,c3,c4,c5] ]

или, настоятельно полагайте:

 for each c1 in primes
    if valid(c1) then foreach c2 in primes
        if valid(c1,c2) then foreach c3 in primes
            if valid(c1,c2,c3) then foreach c4 in primes
                 if valid(c1,c2,c3,c4) then foreach c5 in primes
                      if valid(c1,c2,c3,c4,c5) then print solution

Приложение: поскольку нам нужно искать только числа, которые начинаются с seqeuence определенных цифр, решение может быть сделано более эффективным. Рассмотрим случай, когда c1, c2, annd c3 заданы и действительны() собирается проверить строку 3. Он принимает 3-ю цифру c1, c2 и c3, и мы можем интерпретировать их как ведущие 3 цифры числа, которое должно появиться в строке 3. Нам нужно только заполнить его нулями и затем проверить, известно ли нам простое число, большее этого числа, но разница должна быть меньше 100 (так что ведущие разряды сохраняются). Но если у нас есть отсортированный массив с простым номером, это требует не более, чем двоичного поиска в этом массиве.