Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ слова с метограммой составить цепочку пошаговым методом

Автор: maksimla 15.03.2009 14:10

5 задание.
Словом метаграмма называется слово, полученное изменить одну букву в слове. Из несколько слов можно сделать цепочку метаграмм, соединяющею два слова. Самая маленькая цепочка есть слово и его метаграмма.

напишите программа которая определила два слова можно соединить метаграмной цепочкой.

Первичные данные написаны в файле duom.txt . На первой строчке написан натуральное число n
(2 ≤ n ≤ 20), на остальных n строчках по одному на писаному слову. Слово не больше 100 символов больших литовских букв.

Результат записывается в файл rez.txt. Если два первичные файловых слова можно соединить цепочкой, то в единственный результат записывает слово MOZNO. В другом случае записываем NEMOZNO.

первичные данные и результат
первичные данные
4
RYTAS
BATAS
RATAS
BADAS
Результат
MOZNO
Объяснение
RYTAS - RATAS - BATAS

ДОПОЛНИТЕЛЬНО НАПИСАТЬ ГЕНЕРАТОР СЛОВ
всего 20 слов
вопрос в словах должна быть такая же самая длина слова чтобы было соединено например
BATAS
RATA
?
а тут обязательно два первых слова соединить?
я так думаю что сперва как-то так надо
все слова в массив потом сравниваем слово. слово сравниваем по буквам и если в слове не совпадает одна буква то совпадает и это как-то true и все если нет то берем первое и третье слово и смотрим совпадает или нет и так далее.
и как написать методом обратным методом (пошаговым методом)?




Автор: Lapp 15.03.2009 19:05

Цитата(maksimla @ 15.03.2009 10:10) *
вопрос в словах должна быть такая же самая длина слова чтобы было соединено например
BATAS
RATA
?
а тут обязательно два первых слова соединить?
я так думаю что сперва как-то так надо
все слова в массив потом сравниваем слово. слово сравниваем по буквам и если в слове не совпадает одна буква то совпадает и это как-то true и все если нет то берем первое и третье слово и смотрим совпадает или нет и так далее.
и как написать методом обратным методом (пошаговым методом)?
Судя по условию, допускается только замена букв, но не добавление/удаление. То есть все слова должны быть равной длины.

В принципе, ты все правильно думаешь. А написать можно прмерно так (с рекурсией):
const
m=20;

var
i,n,l: word;
w: array[1..m]of string;
Used: array[1..m]of boolean;
f: text;

function Connected(a,b: word): boolean;
var
i,j: integer;
r,ua,ub: boolean;
begin
ua:=Used[a];
Used[a]:=true;
ub:=Used[b];
Used[b]:=true;
j:=0;
for i:=1 to l do if w[a][i]<>w[b][i] then Inc(j);
if j=1 then Connected:=true else begin
i:=3;
r:=false;
repeat
if not Used[i] then r:=Connected(a,i) and Connected(i,b);
Inc(i)
until r or (i>n);
Connected:=r
end;
Used[a]:=ua;
Used[b]:=ub
end;

begin
Assign(f,'duom.txt');
ReSet(f);
ReadLn(f,n);
for i:=1 to n do ReadLn(f,w[i]);
Close(f);
l:=Length(w[1]);
for i:=3 to n do Used[i]:=false;
WriteLn(Connected(1,2))
end.

Нужный вывод в файл сделай сам. Что неясно - спрашивай smile.gif.

Добавлено через 11 мин.
Цитата(maksimla @ 15.03.2009 10:10) *
ДОПОЛНИТЕЛЬНО НАПИСАТЬ ГЕНЕРАТОР СЛОВ
всего 20 слов
Генератор слов сделать легко, но только если брать все латинские (извини, литовских не знаю) буквы полностью случайно, то, боюсь, на двадцати словах результат будет NEMOZNO с подавляющей вероятностью. Так что, если хочется иногда получать MOZNO, то нужно генерить не просто так.. smile.gif

PS
лучше сказать NEVOZMOZNO, слова "неможно" в русском нет smile.gif.

Автор: maksimla 18.03.2009 15:36

кажется тут более менее все понятно только это непонятно или я забыл что оно значит или делает

l:=Length(w[1]);


Автор: Lapp 18.03.2009 16:56

Цитата(maksimla @ 18.03.2009 11:36) *
кажется тут более менее все понятно только это непонятно или я забыл что оно значит или делает
l:=Length(w[1]);
Это как раз самое простое. Функция Length возвращает длину строки. Поскольку (как я уже говорил) все слова должны быть одинаковой длины, то достаточно узнать длину одного из них и сохранить, чтобы потом использовать.

Значит, с рекурсией все ясно?

Автор: maksimla 18.03.2009 21:53

да спасибо все понятно

Автор: maksimla 20.03.2009 16:28

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

const
a=['A','À','B','C','È','D','E','Æ','Ë','F','G','H','I','Á','Y','J','K','L','M','N','O','P','R','S','Ð','T','U','Ø','Û','V','Z','Þ'];
var
n,i,x: integer;
t:text;
c:char;
begin
assign (t, 'duom.TXT');
rewrite (t);
randomize;
n:= random(100)+1;
x:= random(20)+1;
writeln(t,x);
for i:=1 to x do
begin
for i:=1 to n do
begin
c:= random(a);
write(t,c);
end;
writeln;
end
close(t);
end.


Автор: Lapp 20.03.2009 17:55

Цитата(maksimla @ 20.03.2009 12:28) *
но чего то ошибка есть
Ты все же говори, какая именно ошибка. У тебя там много ошибок, я не знаю, на какой ты застрял.

1. Мой совет: сначала сделай программу для латинских букв и отладь, а потом переходи на литовские, если нужно.

2. Почему ты используешь один параметр (i) для двух вложенных циклов? Это грубейшая ошибка.

3. Почему ты делаешь переменное количество букв в слове?? Я же говорил уже.. Да еще до ста букв! Что, бывают такие слова в литовском? blink.gif

4. Зачем тебе множество a? Сделай массив букв, примерно вот так:
const
a: array [1..NLetters] of char=
('A','А','B','C','И','D','E','Ж','Л','F','G','H','I','Б','Y','J','K','L','M','N','O','P','R','S','Р','T','U','Ш','Ы','V','Z','Ю');

5. Почему у тебя множество стоит в параметре random? Сделай примерно так:
  c:=a[random(NLetters)+1];

Еще раз: если спрашиваешь про ошибку - говори, пожалуйста, про какую..

Автор: maksimla 20.03.2009 22:53

Цитата(Lapp @ 20.03.2009 12:55) *

Ты все же говори, какая именно ошибка. У тебя там много ошибок, я не знаю, на какой ты застрял.

1. Мой совет: сначала сделай программу для латинских букв и отладь, а потом переходи на литовские, если нужно.

2. Почему ты используешь один параметр (i) для двух вложенных циклов? Это грубейшая ошибка.

3. Почему ты делаешь переменное количество букв в слове?? Я же говорил уже.. Да еще до ста букв! Что, бывают такие слова в литовском? blink.gif

4. Зачем тебе множество a? Сделай массив букв, примерно вот так:
const
a: array [1..NLetters] of char=
('A','А','B','C','И','D','E','Ж','Л','F','G','H','I','Б','Y','J','K','L','M','N','O','P','R','S','Р','T','U','Ш','Ы','V','Z','Ю');

5. Почему у тебя множество стоит в параметре random? Сделай примерно так:
  c:=a[random(NLetters)+1];

Еще раз: если спрашиваешь про ошибку - говори, пожалуйста, про какую..

1. а какая разница сперва латинские или литовские буквы
2. забыл наверное
3 одинаковое количиство букв в слове делаю. Самое большое слово кажется 40 букв в слове есть. Я исхожу из задачи что "Слово считается недлинее чем 100 символов" исходя из программы поэтому написал так .
4. незнаю смотрел что то все. а как вы сделали я хотел тоже както так то об этом забыл и не нашел в книжке .
5 а я сам не заметил что я много ошибок сделал да притом же и глупых ошибок не знаю что со мной случилось .

Вот написал как вы сказали но вы сейчас смеяться будете в файл не хочет выводить по словам все в одну строчку пишет
const
NLetters=32;
a: array [1..NLetters] of char=
('A','À','B','C','È','D','E','Æ','Ë','F','G','H','I','Á','Y','J','K','L','M','N','O','P','R','S','Ð','T','U','Ø','Û','V','Z','Þ');
var
n,i,x,j: integer;
t:text;
c:char;
begin
assign (t, 'duom.TXT');
rewrite (t);
randomize;
n:= random(100)+1;
x:= random(20)+1;
writeln(t,x);
for i:=1 to x do
begin
for j:=1 to n do
begin
c:= a[random(NLetters)+1];
write(t,c);
end;
writeln;
end;
close(t);
end.


Автор: volvo 20.03.2009 23:27

Цитата
в файл не хочет выводить по словам все в одну строчку пишет
Правильно делает... Ты ж Writeln делаешь не в файл, а надо бы в файл: Writeln(t)

Автор: maksimla 21.03.2009 0:33

да уж спасибо сам даже засмеялся я что не увидел такого lol.gif
всем спасибо можно тему закрывать