Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перебор


Страницы:   1 2

Gydvin ©   (2006-01-31 11:18:00) 

Привет all тут проблема возникла  с перебором. вот код

procedure TForm1.Button1Click(Sender: TObject);
var
list,list1,list2:tstringlist;
a,t,x,y:integer;
r:array of string;
s,s1:string;
label ik;
begin
a:=5;
setlength(r,a+2);
list:=tstringlist.Create;
list1:=tstringlist.Create;
list2:=tstringlist.Create;
//list.LoadFromFile('file.txt');  ///текстовый файл с нобором строк
  x:=0;
  while x<a do begin
   inc(a);
   ik:
   ///// s:=der(x);    здесь мы получаем маску слова
   s:='п?ляна';///например вот эту маску;

        list1.Clear;
        list2.Clear;

        t:=length(s);

        //здесь получаем список строк подходящих по длине к маске (s)
       for y:=0 to list.Count-1 do begin
         s1:=list.Strings[y];
         if length(s1)=t then list1.Add(s1);
       end;

        list2.Text:=r[x]; //// сюда грузим слова уже раннее проверенные

        ////здесь удаляем из списка ранее проверенные
        for y:=0 to list2.Count-1 do begin
         s1:=list2.Strings[y];
         t:=list1.IndexOf(s1);
         if t>-1 then list1.Delete(t);
        end;

          list1.Clear;
         ////здесь получаем слова подходящие по маске
       for y:=0 to list1.Count-1 do begin
         s1:=list1.Strings[y];
            for t:=1 to length(s1) do if s[t]='?' then s1[t]:='?';
         if s1=s then list2.Add(list1.Strings[y]);
       end;
     ///  здесь выбираем слово из списка
      randomize;
      s:=list2.Strings[(list2.Count)];
      // если слова не оказалось, тоесть нет вариантов
     if s='' then begin
      r[x]:='';   ///, мы возвращаемся на шаг назад
      dec(x);
      if (x<1)or(x=1) then begin
         showmessage('Были прверены все варианты');
         exit;
         //здесь выходим если больше назад вернутся неможем
      end;
       goto ik;
     end;
     ///здесь есль слово все же есть мы проделываем с ним определенные
//действия
     /// и скидываем его в использованные

   r[x]:=r[x]+s+#13#10;   ///сохранение проверенного слова
  end;


А вот, что конкретно не устраивает, по мере наполнения r[x], алгоритм начинает тормозить, да и плоско как то (r[x]:=r[x]+s+#13#10) это выглядит. И вобще алгоритм медленный, короче одним словом плоский, может кто знает как сделать это лучше или какие предложения будут, я непротив, а то уже голову сломал, а путевого ничего придумать не могу.


Gydvin   (2006-01-31 11:23:00) [21]

Ой, опечатка

    list1.Clear;
        ////здесь получаем слова подходящие по маске
     
надо

  list2.Clear;
        ////здесь получаем слова подходящие по маске


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо