Анаграммы - это слова, которые состоят из одних и тех же букв в равных количествах. Например, ТОПОР - РОПОТ - ОТПОР.
Естественно, все анаграммы состоят из равного количества букв, поэтому при поиске анаграмм нужно проверять только слова той же длины, что и заданное слово. Это значительно сокращает перебор слов, но - нужно заранее знать, что заданное слово имеет анаграмму, иначе придётся перебирать все слова.
Но мы уже выяснили, что полный перебор слов лучше поручить компьютеру. Напишите программу, которая найдёт все анаграммы русского языка!
Анаграммы
Мы начнём с того, что загрузим словарь и сразу же приступим к поиску анаграмм
procedure TfrmMam. FormCreate (Sender: TObject) ;
begin
{загрузить слозарь по умолчанию и запомнить его имя}
filename:= DefaultFileName;
loadfile;
end;
procedure TfrmMain.FormActivate(Sender: TObject);
begin
Find;
end;
Казалось бы, задача непростая, но достаточно сделать несколько дополнений к Наборщику, и можно приниматься за дело:
//НАЙТИ НУЖНЫЕ СЛОВА
procedure TfrmMain.Find;
var
s,str : String;
i,j,n,len: integer;
flag: boolean;
word, curWord: array[1 A'..1Я1 ] of integer;
ch: char;
begin
sbtSave.Enabled:= false;
sbtOpenFile.Enabled:= false;
IstProtokol.Items.clear;
for n:=l to WordsAll do begin
//обнуляем массив - ни одной буквы пока в нём нет:
for ch:='A' to 'Я' do
word[ch]:=0;
s:= spisok[n];
len:= length(s);
//считаем буквы в слове и формируем массиз:
for i:=l to len do begin
inc(word[s]);
end;
str:=1';
//отыскизаем анаграммы и заносим их з протокол:
for i:=BeginWord[len] to BeginWord[len]+NumWords[len]-1 do
begin
cu rWo rd:= word;
flag:= TRUE;
for j:=1 to len do begin
dec (curWord[spisok[i,j]]);
if curWord [spisok [i, j ] ]<0thenbegin//-такойбуквы
нет!
flag:= FALSE;
break;
end;
end;
if flag and (s<> spisok) then str:= str +''+spi-
sok ;
end;
application.ProcessMessages;
if str<>'' then IstProtokol.Items.Add(s + 11 + str);
end;
sbtSave.Enabled:= true;
sbtOpenFile.Enabled:= true;
end;
На что нужно обратить внимание в этой процедуре?
Желательно отключить «лишние» кнопки. Всё-таки поиск анаграмм дело небыстрое, немного придётся и подождать, но ведь от безделья пользователь начнёт жать на все кнопки, а это чревато. Нужно оградить его от вредной забавы (по-научному, это называется «защита от дурака», не в обиду будь сказано).
Роль заданного слова будут последовательно исполнять все слова из списка.
Изящнее и правильнее анаграммы выписывать не в колонку, а в одну строку, поэтому придётся постараться и сделать красиво.
Так как каждое слово является анаграммой самого себя, то мы для всех слов найдём «анаграммы», что нехорошо. Это надо учесть!