2013-09-22 5 views
1

Был задан вопрос о создании списка 10-значных телефонных номеров на PhonePad с учетом набора возможных ходов и стартового номера.Перестановки смещений Java

Phonepad:
* 0 #

Возможные ходы:
То же самое количество ходов королева в шахматах (например, север, юг, восток, запад, северо-восток, северо-запад, юго-восток, юго-запад ... n-пространства на каждую ориентацию)

Начиная номер: 5

До сих пор я реализовал Phonepad как 2-мерного массива полукокса, реализуемый возможные ходы королевы может сделать в HashMap (используя смещения х и у), и я могу сделать Королева перемещается на один квадрат, используя один из возможных ходов.

Следующий шаг - выяснить алгоритм, который даст мне все 10-значные перестановки (номера телефонов), используя возможные шаги в моем HasMap. Допускается повторение номера. * и # не разрешены в списке возвращенных номеров.

Я предположил бы, что, начиная с
- 5555555555, 5555555551, 5555555552 ... и так далее до 0,
- 5555555515, 5555555155, 5555551555 .. 5155555555 .. и с номерами 2 ДО 0
- 5555555151, 5555551515, 5555515155 .. 5151555555 .. и с номерами 2 ДО 0
... и так далее для двузначной комбинации с

Любые предложения о систематическом подходе генерирующего комбинации 10-значной? Даже алгоритм псевдокода оценивается! Позвольте мне знать, требуется ли дополнительное разъяснение.

Заранее благодарен! :)

+1

Это, кажется, проблема с глубиной первого поиска (DFS). См .: http://en.wikipedia.org/wiki/Depth-first_search –

ответ

0

Более подробно, самый простой подход был бы рекурсивный метод, примерно так:

  • Он принимает строку префикса изначально пустой, текущий разряд (первоначально «5»), а также ряд цифры для генерации (изначально 10).
  • Если число цифр равно 1, оно просто выводит префикс, связанный с текущей цифрой.
  • Если число цифр больше 1, то оно будет составлять список всех возможных следующих цифр и вызывать себя рекурсивно (префикс + (текущая цифра), следующая цифра (число цифр) -1) в качестве аргументы.

Другие подходы, а также уточнения к этому, возможны, конечно. Действие «output» может быть записано в файл, добавлено в поле текущего класса или объекта или добавлено в локальную коллекцию переменных (List или Set), которая будет возвращена в результате. В этом последнем случае логике (ndigits> 1) пришлось бы объединить результаты нескольких рекурсивных вызовов, чтобы получить одно возвращаемое значение.

Смежные вопросы