Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.18;
Скачать: CL | DM;

Вниз

Задачка...   Найти похожие ветки 

 
Ajax ©   (2002-03-07 17:55) [0]

Мне недавно предложили решить задачку. Нужно указать все варианты перестановок из 8 цифр и положить все это в файл, одна строчка - одна перестановка. А в конце задачи небольшое уточнение - программа должна работать не более 10 секунд. Вот тут то и выходит прокол. Прогу я написал, только вот работает она на PIII 500MHz около 3 минут. Я делал в лоб - перебирал все восьмизначные числа и выбирал нужные. Может есть какой-нибудь алгоритм побыстрее?


 
Фэ ©   (2002-03-07 18:02) [1]

Шо ?
В шесть часов вечера перед войной ?
Тебе предложили, Это ?
Тебе о Женщинах сегодня думать, и не только, надо.
Брось все, кроме них.
Они этого стоят !!!


 
ghost_by ©   (2002-03-07 18:14) [2]

Может есть какой-нибудь алгоритм побыстрее? - Конечно есть - рекурсия, по идее на порядок быстрее будет.


 
Ajax ©   (2002-03-07 18:35) [3]

2Фэ: ИМХО 8 марта только завтра, или нет? Хотя ты прав, конечно. :)
2ghost_by: может объяснишь, а то что-то не догоняю.


 
VuDZ ©   (2002-03-07 18:41) [4]

я думаю Кнут спасёт отца русской демократии - там всё хорошо о перестановках написано


 
McSimm ©   (2002-03-07 18:45) [5]

Задачка на 5 минут. У нас тут праздник на фирме, я между стопками набросал :)
На моем компьютере работает 00мин:00сек
Если чего не так сделал - предупреждаю, начал после 3й :)

procedure TForm1.Button1Click(Sender: TObject);
var F: TextFile;
T1: TDateTime;
type
TDigitSet = Set of Char;

procedure OutStr(const S: String);
begin
Writeln(F, S)
end;

procedure Req(const S: String; St: TDigitSet);
var C: Char;
begin
if Length(S) = 8 then
begin
OutStr(S);
Exit
end;
for C := "1" to "8" do
if not (C in St) then
Req(S+C, St+[C])
end;
begin
AssignFile(F, "e:\Digits.txt");
Rewrite(F);
try
T1 := Now;
Req("", []);
Label1.Caption := FormatDateTime("nn:ss", Now-T1)
finally
CloseFile(F)
end
end;


 
Ajax ©   (2002-03-08 09:33) [6]

Хоть убей не могу понять, почему код от McSimm работает. Ведь в множество St постоянно включаются элементы, а чтобы они удалялись я не вижу. Объясните плз.


 
Mystic ©   (2002-03-08 15:37) [7]

А они не удаляются. Максимальная глубина рекурсии - 8. На каждом шаге есть свои S и St. Как только мы их полностью заполнили (перебрали все варианты заполения), мы выводим результат и возвращаемся на шаг назад.


 
McSimm ©   (2002-03-10 11:55) [8]

>Хоть убей не могу понять, почему код от McSimm работает.

Это что, у меня бывает так, что хоть убей не могу понять почему собственный код работает !!!

Маленький совет. Переделай программу для диапазона "1".."3":
if Length(S) = 3...for C := "1" to "3", поставь точку прерывания на процедуру, добавь входные параметры St и S в Watch-list. Это поможет сразу разобраться в принципе работы рекурсии лучше любых объяснений.

Кстати, приведенный выше код можно упростить и обойтись без St. Правда за счет быстродействия - раза в 2-3 дольше, но все равно меньше секунды:
procedure TForm1.Button1Click(Sender: TObject);
var F: TextFile;
T1: TDateTime;
procedure Req(const S: String);
var C: Char;
begin
if Length(S) = 8 then Writeln(F, S)
else
for C := "1" to "8" do
if Pos(C, S) = 0 then
Req(S+C)
end;
begin
AssignFile(F, "e:\Digits.txt");
Rewrite(F);
try
T1 := Now;
Req("");
Label1.Caption := FormatDateTime("nn:ss.z", Now-T1)
finally
CloseFile(F)
end
end;




Страницы: 1 вся ветка

Текущий архив: 2002.04.18;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
3-57658
DRIVER
2002-03-29 08:26
2002.04.18
Работа с БД


1-57744
andr
2002-04-05 13:13
2002.04.18
Как посчитать кол-во дней между 2 датами?


14-57850
drpass
2002-03-08 16:37
2002.04.18
Вся наша жизнь - дерьмо


7-57903
prosof
2001-11-06 12:55
2002.04.18
Видео в полный экран


1-57704
lely
2002-04-04 08:34
2002.04.18
степень числа