Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > каждое последующее слово отлечается от предыдущего


Автор: neosapient 10.11.2006, 09:39
Помогите написать алгоритм, чтоб каждое последующее слово отлечалось от предыдущего на один символ (в собственном алфовите)

Пример:
ГОРА
ГОРЕ
МОРЕ
и так все возможные комбинации

Визуально пример
user posted image

Допустим у меня весь алфавит состоит из двух символов (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,
Код

Коды Грея
...
Этот алгоритм позволяет перебирать все наборы Bm так, чтобы каждый следующий набор
отличался от предыдущего только в одном разряде. Построенная с помощью этого
алгоритма последовательность наборов называется кодом Грея. Вообще, n-разрядный код
Грея — это упорядоченная (возможно, циклическая) последовательность, состоящая из
 2n n-разрядных кодовых слов, каждое из которых отличается от соседнего в одном разряде.


Будем рассматривать бинарные коды Грея порядка n. Итак, на вход алгоритма подается
единственное число n, которое указывает порядок кода Грея. По ходу выполнения
алгоритма мы получим последовательность всех подмножеств n-элементного множества,
в которой каждое последующее подмножество получается из предыдущего добавлением
или удалением единственного элемента (наименьшим возможным изменением) — код Грея.
При этом каждое подмножество будет представляться бинарной последовательностью 
B[1], …, B[n]. 


Gray-Generation(n)
 1  for i := 1 to n do B[i] := 0;
 2  i := 0;
 3  repeat
 4      write (B[i], …, B[n]);
 5      i := i + 1; p := 1; j := i;
 6      while j mod 2 = 0 do
 7          begin
 8              j := j/2; p := p + 1;  // количество 2 в разложении числа на прост. множители + 1
 9          end;
10      if p ≤ n then B[p] := 1 − B[p];
11  until p > n   



Автор: esperant0 10.11.2006, 12:39
да
меняй каждый раз случайно выбранную букву в слове.

через определенное количество шагов почти наверняка обойдешь все слова

Автор: neosapient 10.11.2006, 19:15
Kuvaldis, Ваш текст программы похоже составлен на матлабе.
А можно перевести на С подобный язык.
Просто смутула меня команда write - она что ли выводит на экран?

Цитата

Коды Грея
...
Этот алгоритм позволяет перебирать все наборы Bm так, чтобы каждый следующий набор
отличался от предыдущего только в одном разряде. Построенная с помощью этого
алгоритма последовательность наборов называется кодом Грея. Вообще, n-разрядный код
Грея — это упорядоченная (возможно, циклическая) последовательность, состоящая из
 2n n-разрядных кодовых слов, каждое из которых отличается от соседнего в одном разряде.

Спасибо, хоть буду знать как это называется.

Так, а можно показать код, в котором представлен алгоритм с расширеным (не двоичным) алфавитом.

Автор: BUGOR 11.11.2006, 16:30
http://www.insidepro.com/doc/003r.shtml

Автор: neosapient 11.11.2006, 17:51
Цитата

http://www.insidepro.com/doc/003r.shtml 

Спасибо, конечно. Однако несовсем то, что искал. Я так понял, что этот метод перебирает слова последовательно,
00
01
10
11

А я хочу, чтоб каждое последующее слово отлечалось от предыдущего на один символ 
00
01
11
10
<-> и следующее слово совпадает с первым
00
01
... и т.д.

-----------------------
Собрал, проект и вижу обыкновенный перебор всех чисел, с основой системы счисления 3 (записаных в обратном порядке, т.е. от большего к меньшему).

Нет, не подходит. Мне надо устроить перебор, чтоб каждое последующее слово отлечалось от предыдущего на один символ 
Уже неделю как голову ломаю, видно надо искать математического гения, чтоб алгоритм составил.

Автор: BUGOR 11.11.2006, 18:36
Аа, понял, пардонsmile

Автор: neosapient 12.11.2006, 17:38
Ну, ни у кого идей не осталось?

Автор: esperant0 12.11.2006, 18:29
Цитата(neosapient @ 12.11.2006,  17:38)
Ну, ни у кого идей не осталось?

я уже дал вам алгоритм уловлетворяющий вашему критерию

Автор: 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) стартовое слово - случайно определено/задано

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

Напишите пожалуйста алгоритм,  лучше если это будет итерация, но рекурсия тоже подойдет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)