Информация об изменениях

Сообщение Re: Поиск пути от 19.10.2015 19:04

Изменено 19.10.2015 19:14 Qulac

Здравствуйте, olimp_20, Вы писали:

_>Задано таблицу N * M, в каждой ячейке которой написана одна строчная буква английского алфавита. Рассмотрим все возможные пути от левого верхнего угла к правому нижнему углу, если вам разрешено идти только вправо и вниз. Конкатенация букв в процессе движения образует строку. Будем считать, что эта строка — значение пути. Теперь рассмотрим все такие пути и отсортируем их значение в алфавитном порядке. Ваша задача: найти значение I-го пути в этом отсортированном списке.


_>Формат входных данных

_>Первая строка входного файла содержит два целых числа N (количество строк) и M (количество столбцов): 1≤N, M≤30. Следующие N строк содержат M строчных букв английского алфавита. Последняя строка входного файла содержит целое число I (1≤I≤1018).
_>Формат результата
_>Выходной файл должен содержать одну строку — ответ на задачу.

_>
_>
_>
_>
_>
_>
_>
_>
_>
_>
Входные данные в файле input.txt Результат работы в файле output.txt
5 5
_>pbbvb
_>jhzxz
_>zbvey
_>wgrgv
_>mlzgt
_>18
pbhbgrgvt

_>Примечания
_>pbbvbzyvt pbbvxeggt pbbvxegvt pbbvxeyvt pbbvxzyvt pbbzveggt pbbzvegvt pbbzveyvt pbbzvrggt pbbzvrgvt pbbzvrzgt pbbzxeggt pbbzxegvt pbbzxeyvt pbbzxzyvt pbhbglzgt pbhbgrggt pbhbgrgvt pbhbgrzgt pbhbveggt pbhbvegvt pbhbveyvt pbhbvrggt pbhbvrgvt pbhbvrzgt pbhzveggt pbhzvegvt pbhzveyvt pbhzvrggt pbhzvrgvt pbhzvrzgt pbhzxeggt pbhzxegvt pbhzxeyvt pbhzxzyvt pjhbglzgt pjhbgrggt pjhbgrgvt pjhbgrzgt pjhbveggt pjhbvegvt pjhbveyvt pjhbvrggt pjhbvrgvt pjhbvrzgt pjhzveggt pjhzvegvt pjhzveyvt pjhzvrggt pjhzvrgvt pjhzvrzgt pjhzxeggt pjhzxegvt pjhzxeyvt pjhzxzyvt pjzbglzgt pjzbgrggt pjzbgrgvt pjzbgrzgt pjzbveggt pjzbvegvt pjzbveyvt pjzbvrggt pjzbvrgvt pjzbvrzgt pjzwglzgt pjzwgrggt pjzwgrgvt pjzwgrzgt pjzwmlzgt

_>Моя попытка решить:

_>1) использовать алгоритм "перебор з возвратом";
_>2) когда выбирается новый кандидат, то сравниваются символы из допустимых ячеек таблицы (учитывая допустимые направления).

_>Возникла проблема: а как сделать выбор, если оба направления (вправо, вниз) — допустимые и возможные кандидаты (ячейки таблицы) содержат одинаковые символы?..


_> Вопрос:

_>1) можно ли таким алгоритмом решит эту задачу, если "да", то как быть с выбором между одинаковыми кандидатами?
_>2) какой алгоритм (если указанный мною способ неверен) вместо перебора с возвратом может решить эту задачу эффективнее

Проблема как я понял в коллизиях, т.е. тогда, когда есть равнозначные буквы в разных вариантах пути.
Путь есть функция на вход которой поступает массиф координат ячеек, на выходе координаты следующей ячейки. Функция делает просмотр на один шаг в перед от каждой ячейки и если есть часть строки идущая по алфовиту первой, то рекурсивно вызывает сама себя с координатами этой ячейки. Если опять находиться коллизия, то функция рекурсивно вызывает сама себя с координатами ячеек участвующих в коллизии. И так до крайнего угла. Остается только последовательность реккурсивных
вызовов преобразовать в строку.
Re: Поиск пути
Здравствуйте, olimp_20, Вы писали:

_>Задано таблицу N * M, в каждой ячейке которой написана одна строчная буква английского алфавита. Рассмотрим все возможные пути от левого верхнего угла к правому нижнему углу, если вам разрешено идти только вправо и вниз. Конкатенация букв в процессе движения образует строку. Будем считать, что эта строка — значение пути. Теперь рассмотрим все такие пути и отсортируем их значение в алфавитном порядке. Ваша задача: найти значение I-го пути в этом отсортированном списке.


_>Формат входных данных

_>Первая строка входного файла содержит два целых числа N (количество строк) и M (количество столбцов): 1≤N, M≤30. Следующие N строк содержат M строчных букв английского алфавита. Последняя строка входного файла содержит целое число I (1≤I≤1018).
_>Формат результата
_>Выходной файл должен содержать одну строку — ответ на задачу.

_>
_>
_>
_>
_>
_>
_>
_>
_>
_>
Входные данные в файле input.txt Результат работы в файле output.txt
5 5
_>pbbvb
_>jhzxz
_>zbvey
_>wgrgv
_>mlzgt
_>18
pbhbgrgvt

_>Примечания
_>pbbvbzyvt pbbvxeggt pbbvxegvt pbbvxeyvt pbbvxzyvt pbbzveggt pbbzvegvt pbbzveyvt pbbzvrggt pbbzvrgvt pbbzvrzgt pbbzxeggt pbbzxegvt pbbzxeyvt pbbzxzyvt pbhbglzgt pbhbgrggt pbhbgrgvt pbhbgrzgt pbhbveggt pbhbvegvt pbhbveyvt pbhbvrggt pbhbvrgvt pbhbvrzgt pbhzveggt pbhzvegvt pbhzveyvt pbhzvrggt pbhzvrgvt pbhzvrzgt pbhzxeggt pbhzxegvt pbhzxeyvt pbhzxzyvt pjhbglzgt pjhbgrggt pjhbgrgvt pjhbgrzgt pjhbveggt pjhbvegvt pjhbveyvt pjhbvrggt pjhbvrgvt pjhbvrzgt pjhzveggt pjhzvegvt pjhzveyvt pjhzvrggt pjhzvrgvt pjhzvrzgt pjhzxeggt pjhzxegvt pjhzxeyvt pjhzxzyvt pjzbglzgt pjzbgrggt pjzbgrgvt pjzbgrzgt pjzbveggt pjzbvegvt pjzbveyvt pjzbvrggt pjzbvrgvt pjzbvrzgt pjzwglzgt pjzwgrggt pjzwgrgvt pjzwgrzgt pjzwmlzgt

_>Моя попытка решить:

_>1) использовать алгоритм "перебор з возвратом";
_>2) когда выбирается новый кандидат, то сравниваются символы из допустимых ячеек таблицы (учитывая допустимые направления).

_>Возникла проблема: а как сделать выбор, если оба направления (вправо, вниз) — допустимые и возможные кандидаты (ячейки таблицы) содержат одинаковые символы?..


_> Вопрос:

_>1) можно ли таким алгоритмом решит эту задачу, если "да", то как быть с выбором между одинаковыми кандидатами?
_>2) какой алгоритм (если указанный мною способ неверен) вместо перебора с возвратом может решить эту задачу эффективнее

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