Пять цифр простых чисел в сетке 5x5 - PullRequest
13 голосов
/ 22 марта 2011
|---|---|---|---|---|
| 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 - Простые числа.

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

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

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

* Примечание: метод сита Эратосфена, который генерирует 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 Ответ

4 голосов
/ 22 марта 2011

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

Вам понадобится функция valid для проверки правильности квадрата, учитывая от 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

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

...