Форум: "Потрепаться";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];
ВнизПомогите создать Алгоритм Найти похожие ветки
← →
MS-REM (2005-07-30 08:48) [0]Помогите пожалуйста создать алгоритм!
Вообщем есть слово Arazel вот мне сказали сделать методом перебора
Бодобрать это слово но с учетам того что перебор будет ити самого начало
То есть например есть такое слово : 123
Вот пример:
Сначало надо крутить последнию
123
-------------------
000
001
002
003
010
011
012
013
020
021
022
023
030
031
032
033
…
пока не будет равна 123
-------------------
Только она дожна перебирать до 256 символов а длина 128.
Плиззззз помогите кто с алгоритмами работает???
Просто если я сделаю то она получится медленной да ещё много
Памяти хавать будет… То она не пройдет…
← →
Джо © (2005-07-30 08:56) [1]8-()
← →
alpet © (2005-07-30 10:08) [2]Какое отношение к WinAPI это имеет? Здесь к сожеланию нет раздела "Коммерция" где-бы этот пост с обозначенной суммой был бы к месту ))
← →
MS-REM (2005-07-30 13:04) [3]Удалено модератором
Примечание: С разборками в персональную почту
← →
Digitman © (2005-07-30 13:25) [4]орех
← →
Kolan © (2005-07-30 13:25) [5]
> слово сделать методом перебора
Бред какой то я ничего не понял. Что надо то...
← →
palva © (2005-07-30 13:51) [6]Типа, перебирать все слова длины 6 пока не встретится слово Arazel И чтоб программа быстро работала. Так я понял.
← →
DrPass © (2005-07-30 14:02) [7]Неа, с алгоритмами мы не работаем. Это сложно и не интересно. Нам бы закодить чего-то да напрограмить где-нить...
← →
palva © (2005-07-30 14:09) [8]У меня следующий код работает 3 секунды (2400 MHz)
{$APPTYPE CONSOLE}
const
s: ShortString = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
var
i1, i2, i3, i4, i5, i6: Integer;
len: Integer;
p: String[6];
label
e;
begin
len := Length(s);
p := "123456";
for i1 := 1 to len do begin
p[1] := s[i1];
for i2 := 1 to len do begin
p[2] := s[i2];
for i3 := 1 to len do begin
p[3] := s[i3];
for i4 := 1 to len do begin
p[4] := s[i4];
for i5 := 1 to len do begin
p[5] := s[i5];
for i6 := 1 to len do begin
p[6] := s[i6];
if p = "Arazel" then begin
WriteLn("OK");
goto e
end
end
end
end
end
end
end;
WriteLn("Not found");
e:
end.
← →
Anatoly Podgoretsky © (2005-07-30 14:37) [9]Изветсный Arazel в очередной раз поменял ник и ничего не изменилось.
← →
Ms-Rem (real) (2005-07-30 18:53) [10]Удалено модератором
Примечание: Скорее тебя за ненужные советы модераторам.
← →
Eraser © (2005-07-30 19:11) [11]LOL
← →
Palladin © (2005-07-30 21:00) [12]бедняга... брут форс хочет сделать...
← →
Kerk © (2005-07-30 21:01) [13]Ламо вернулось? :)
← →
TStas © (2005-07-30 21:05) [14]А мне раз пришлось столкнуться с ситуацией, глде n циклов вложенных должно было быть, придумал, как без них обойтись, если я верно сабж понял.
Идея простая:
Берем массив длинной n. Если n - это переменная, то и массив динамический. Заплоняем его нулями для начала. Пускай массив x зовут.
В переведенном коде максимальное значение len зовут, ну назову maxN так еще более общий случай получится.
Внутри цикла while true
inc(x[0])
пишу цикл, который пробегает всесь массив x. Если x[i]>maxN тогда inc(x[i+1]); x[i]:=x[i+1] else break. Получается как колесики на спидометре, которые километраж мериют. Я как найду код, напишу подробнее, если сабж верно понял, в чем сам сомневаюсь.
Но идея такая, что если очередной элемент вылез из диапазона, то есго назад возвращать, а следующий увеличивать. Тогда не будет n циклов. А массив заменит переменные i1...in
← →
TStas © (2005-07-30 21:14) [15]for I:=1 to N do curVars[i]:=1; //Установка начальных значений
while curVars[n]<=M do //Внешний цикл
begin
for i:=1 to N-1 do //Этот цикл перебрасывает "колесики"-переменные
begin
if curVars[i]>M then //Если переменная больше максимума
begin
inc(curVars[i+1]); //и увеличиваю следующий счетчик
curVars[i]:=curVars[i+1]; //Значит прокрутился счетчик этого "колесика"
end
else break; //Иначе останавливаю
end;
for i:=N-1 downto 1 do //А этот находит вылезания за М и убирает его
begin
if curVars[i]>M then curVars[i]:=curVars[i+1]; //Если есть превышение, то делаю, как стоящий справа
end;
if curVars[n]>M then break; //Если самый правый вылез из диапазона - выход
Вот, нашел код.
curVars - тот самый массив, элементы которого заменяю счетчики цикло.
Далеше код не привожу, там уже идет использование переменных.
Здесь пример в точности описывает ситуацию с вложенными циклами, где следующий бегает от предыдущего.
Код из праверенной программы
← →
TUser © (2005-07-30 21:42) [16]> TStas
Это делают не так
type
TMine = string[3];
function Next (var A: TMine): boolean;
var i: integer;
begin
result:=true; i:=length(A);
while result and (i > 0) do begin
if ord (A[i]) < 255 then begin
A[i] = succ(A[i])
result:=false
end else A[i] = #0;
dec (i);
end;
result:=not result;
end;
procedure Enum;
var A: TMine;
begin
A := #0#0#0;
repeat
{do somethig with A}
until !Next(A)
end;
← →
TUser © (2005-07-30 21:44) [17]Лучше вынести сам алгоритм в отдельную функцию и не забивать им ту честь кода, которая что-то делает с каждым конкретным значением.
← →
TStas © (2005-07-31 01:36) [18]>TUser значит я не верно понял вопрос. Я решил что трудность в том, что вложенные циклы неопределенного кол-ва.
← →
SergP © (2005-07-31 10:34) [19]
> [16] TUser © (30.07.05 21:42)
> [15] TStas © (30.07.05 21:14)
А почему ві считаете что рекурсия - это плохо?
← →
TStas © (2005-07-31 20:02) [20]>SergP
Мне просто показалось, что здесь она ни к чему. А потом ее ведь неприятно отлаживать и стек она переполнить может. Я к ней прибегаю в самых крайних случаях.
Старанно, куда делся автор сабжа? Я просто прочитал
>Только она дожна перебирать до 256 символов а длина 128.
И последовательнось переборов приведена, ну просто из той задачи, из которой я код привел
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.036 c