| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Алгоритмы > каждое последующее слово отлечается от предыдущего |
| Автор: neosapient 10.11.2006, 09:39 |
| Помогите написать алгоритм, чтоб каждое последующее слово отлечалось от предыдущего на один символ (в собственном алфовите) Пример: ГОРА ГОРЕ МОРЕ и так все возможные комбинации Визуально пример ![]() Допустим у меня весь алфавит состоит из двух символов (0 и 1) В слове 2 буквы, тогда всевозмежные комбинации (2символа*2буквы=4сочетания) идут в следующем порядке: 00 01 11 10 Если в слове 3 буквы: 000 001 011 010 110 100 101 111 (этот пример частично верен, т.к. из 111 в 000 нельзя перейти изменением одного символа, надо изменить три символа; хотя я уверен что правильный алгоритм поправит этот пример) А теперь надо чтоб алфавит состоял из 4 символов, а слово имеет 7 букв, и незабывайте о порядке, чтоб каждое последующее слово отлечалось от предыдущего на один символ Добавлено @ 09:47 Есть у кого идеи |
| Автор: Kuvaldis 10.11.2006, 11:40 | ||
neosapient,
|
| Автор: esperant0 10.11.2006, 12:39 |
| да меняй каждый раз случайно выбранную букву в слове. через определенное количество шагов почти наверняка обойдешь все слова |
| Автор: neosapient 10.11.2006, 19:15 | ||
| Kuvaldis, Ваш текст программы похоже составлен на матлабе. А можно перевести на С подобный язык. Просто смутула меня команда write - она что ли выводит на экран?
Спасибо, хоть буду знать как это называется. Так, а можно показать код, в котором представлен алгоритм с расширеным (не двоичным) алфавитом. |
| Автор: BUGOR 11.11.2006, 16:30 |
| http://www.insidepro.com/doc/003r.shtml |
| Автор: neosapient 11.11.2006, 17:51 | ||
Спасибо, конечно. Однако несовсем то, что искал. Я так понял, что этот метод перебирает слова последовательно, 00 01 10 11 А я хочу, чтоб каждое последующее слово отлечалось от предыдущего на один символ 00 01 11 10 <-> и следующее слово совпадает с первым 00 01 ... и т.д. ----------------------- Собрал, проект и вижу обыкновенный перебор всех чисел, с основой системы счисления 3 (записаных в обратном порядке, т.е. от большего к меньшему). Нет, не подходит. Мне надо устроить перебор, чтоб каждое последующее слово отлечалось от предыдущего на один символ Уже неделю как голову ломаю, видно надо искать математического гения, чтоб алгоритм составил. |
| Автор: BUGOR 11.11.2006, 18:36 |
| Аа, понял, пардон |
| Автор: neosapient 12.11.2006, 17:38 |
| Ну, ни у кого идей не осталось? |
| Автор: esperant0 12.11.2006, 18:29 | ||
я уже дал вам алгоритм уловлетворяющий вашему критерию |
| Автор: neosapient 12.11.2006, 19:08 |
| Кажется дошло, 000 100 110 010 011 111 001 101 001 <-> и к началу 000 100 ... Суть в следующем (смотрите прикрепленный рисунок). В слове n букв, то есть n векторов базиса, иными словами имеем n мерное пространство. В данном случае в слове 3 буквы, имеем трехмерную матрицу. Каждая буква из слова принимает значение одного из символов из алфавита, соответствующего данной позиции буквы в слове (представлено числом клеток-значений в векторе). В данном случае каждая буква из слова принимает все символы из алфавита (здесь два символа 0 и 1). У алгоритма такие особенности: 1) смещение на соседнюю неиспользованую ранее клетку, происходит через соединяющую "стенку (пол или потолок)" - т.е. на одну позицию из возможных в данной системе координат. 2) алгоритм должен обойти все клетки 3) последняя клетка соприкосается со стартовой по одной из координат - т.е через соединяющую "стенку (пол или потолок)". 4) если мы упираемся в стенку по одному из векторов, следующий за последним элементом вектора идет первый элемент вектора; связь двунаправленая - работаем над полем (ну над кольцом как минимум). Входные параметры: 1) двумерный массив, первый индекс определяет вектор (букву, позицию в слове), второй индекс определяет символ алфавита для данного вектора (значение, которое принимает буква вданной позиции слова). 2) стартовое слово - случайно определено/задано Выходные параметры: массив слов, от стартового слова и до последнего, между ними перечислены все переходные слова; размер массива ответа равен произведению всех длин каждого из векторов (длина каждого из векторов = количество символов в соответствующем этому вектору алфавите = кол-во значений, которые может принять буква в соответствующей позиции в слове). Напишите пожалуйста алгоритм, лучше если это будет итерация, но рекурсия тоже подойдет. |