Алгоритмическая задачка



cleg
12.01.2007, 21:53

Сегодня задали.

Есть некий связанный список, для которого определены две операции – перемещение на N элементов и получение текущего указателя.

Нужно определить закольцован этот список или нет, при условии что хранить позицию указателя нельзя.

ЗЫ Если интересно – продолжим с задачками :-)



alx
12.01.2007, 22:28

Что-то термины не ясны.

Получение текущего указателя – получение указателя на текущий элемент списка?

Хранить позицию указателя – в смысле как бы после операции «перемещения на N элементов» указатель, полученный с помощью операции «получение текущего указателя», становится недействительным?

Начальное положение в списке какое?

Что возвратит операция «получение текущего указателя» если после очередного «перемещения» я попаду в за пределы списка? Если null, то можно переместиться на максимальное значение unsigned в любую сторону и проверить, а не null ли там образовался. Вряд ли есть такой комп, у которого размер unsigned не превосходит размер оперативки-виртуалки.



cleg
12.01.2007, 22:50

ты себе связанный список представляешь? это не массив.

грубо говоря – у него два поля: хранимое значение и указатель на след. элемент.

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

таким образом: начальное положение не определено. переместиться на максимальное значение unsigned в какую-то сторону – не получится, так как если список циклический, ты будешь ходить по кругу. от как определить – ходишь ли ты по кругу, или это просто длинный список.

для упрощения скажем так:

получение текущего указателя – получение идентификатора текущей ячейки (считаем что они всегда уникальны) но запоминать его в переменную нельзя.

после перемещения указатель на текущий элемент меняется. как кинопленка: ты можешь смотреть на один кадр только. или смещать ее на N кадров.

начальное положение в списке – случайное.

получение текущего указателя после перемещения за пределы списка возвращает некое случайное значение (как в С)

ну и поскольку случай абстрактный – список может быть ОЧЕНЬ большим.



alx
12.01.2007, 22:56

ты себе связанный список представляешь? это не массив.

Представляю ;) Спасибо, я в теме.

Еще один прояснительный вопрос: если после очередного перемещения на некое N я попал за пределы списка, то перемещение на – N возвратит меня на прежнее место?



cleg
12.01.2007, 23:02

список однонаправленный. так что перемещаться можно тока в одну сторону



alx
12.01.2007, 23:06

Тю, блин. Так с этого ж начинать нужно было.



typedef ChtoTo Ptr;

Ptr GetCurrentPtr();

void MovePtr(int n);

int IsItLoop()

{

int i;

for (int i = 1; i < CHTOTO_OCHEN_BOLSHOE; i++)

if (GetCurrentPtr() == (MovePtr(n), GetCurrentPtr()))

return 1;

return 0;

}

Умнее ничего пока не придумал. Учитывая, что это как бы прогрессия, то программа будет работать не очень бесконечное число циклов ;) Хотя интересно, на сколько быстро выполняется MovePtr.



i в момент выхода будет равно длине петли – полезная инфа. А проверку на нулевую длину списка я что-то не могу придумать.

Два GetCurrentPtr подряд на один и тот же «несуществующий элемент» выдадут одно и то же случайное число? Думаю, да. Точнее, ни на что конкретное нельзя рассчитывать.



mas
12.01.2007, 23:22

от как определить – ходишь ли ты по кругу, или это просто длинный список.

гоним цикл от 0 до (2^32 – 1) (или 2^64, сколько надо короче :) ), если указатель на следующий элемент не берется, значит список не замкнут, или я чего-то не понял?



alx
12.01.2007, 23:24

если указатель на следующий элемент не берется

Получается, этот момент выкупить нельзя – видать, в этом-то то и бяка. Как узнать, что он не взялся? Нет средств к проверке на валидность. Или эти средства не были упомянуты ;)



Кстати, по-любому нужны еще такие задачки. Мозги от ржавчины прочищать. Тока можно, плз, условия поточнее? ;)



cleg
12.01.2007, 23:27

нет, таких средств нету :-)

в этом и заковыка задачи… ;-)

там все банально.

дать хинт?



alx
12.01.2007, 23:27

Не нада хинтов!

добавлено через 34 секунды

Хинты можно нагуглить ;) Но это не респект.



cleg
12.01.2007, 23:28

ок. я спать. до завтра :-)

ЗЫ продолжать подобные задачки выкладывать?



mas
12.01.2007, 23:29

Как узнать, что он не взялся?

если указывает на несуществующий блок памяти :)



alx
12.01.2007, 23:29

Хотя вот если ты перепроверишь написанное тобою условие на предмет пропусков чего-то важного (вроде однонаправленности списка ;), то это было бы очень хорошо.

добавлено через 31 секунду

ЗЫ продолжать подобные задачки выкладывать?

Канечно. Уже ж написал.



cleg
12.01.2007, 23:36

если указывает на несуществующий блок памяти :)

так не укажет!!! :-)

Хотя вот если ты перепроверишь написанное тобою условие на предмет пропусков чего-то важного (вроде однонаправленности списка ;), то это было бы очень хорошо.

дык это я уже уточняю. в оригинале задача была в той формулировке что я дал. остальное подразумевалось…

хотя обычно конечно задачи формулируются проще :-) но эта ОЧЕНЬ красиво решается…



alx
12.01.2007, 23:39

остальное подразумевалось…

Ничесе подразумевалось. У меня, например, возможность перемещения на N сразу подразумевает, что N – int, и работаем мы, значит, с двунаправленным списком.

Раз уж все остальное подразумевается… Тогда я подразумеваю, что можно XOR’нуть указатель с чем-нибудь (с нулем ;) и хранить результат XOR’а. Идет такое подразумевание?



Пояснение: N – int потому, что дефольтный тип в C – int. Если не указано, то подразумевается int ;)



cleg
12.01.2007, 23:44

обычно связанные списки – однонаправленные, поскольку второй указатель 0 лишняя накладка :-)

не, ну ксорить это не этично. я ж написал что хранить указатель нельзя. тут подразумевалось что хранить нельзя ни в каком виде.

ЗЫ а ко мне чего претензии? я-то уточняю :-) это мне не уточняли…

ЗЗЫ конкретную программу можно не писать, достаточно описать идею.



mas
12.01.2007, 23:47

получение текущего указателя после перемещения за пределы списка возвращает некое случайное значение (как в С)

т.е. случайное? может случайно вернуть указатель на какой-то предыдущий элемент или как?

говори, наверное, ответ уже, а то тут больше вопросов чем ответов :)



alx
12.01.2007, 23:50

обычно связанные списки – однонаправленные, поскольку второй указатель 0 лишняя накладка :-)

Это у кого как. Если по списку нужно перемещаться часто и густо, то второй указатель очень не лишний.

тут подразумевалось что хранить нельзя ни в каком виде.

Опять что-то подразумевалось. Обычно если в задаче что-то не указано, то условия можно в свою сторону «подкрутить» – такое подразумевалось в задачах по физике и математике. И не «обычно» подразумевалось, а «всегда».

Если бы реализация списка была видна, все эти вопросы и «подразумения» не возникли бы. А так – даже не знаешь, что решаешь.

Хотя общую проблему это не снимает. Решения лучше того, что привел, пока не вижу. Ищем дальше…

добавлено через 51 секунду

говори, наверное, ответ уже, а то тут больше вопросов чем ответов :)

Будет обидно, если что-то такое нужное и необходимое «подразумевалось», да не было сказано.



Кстати, вот оригинальное задание:

Имеется односвязный список (см. Вирта). Есть подозрение, что этот список закольцован (т.е. в нем последний элемент указывает не в «нуль», а на какой-то элемент из середины [не обязательно первый]). Требуется определить, есть кольцо в списке или нет. На то, чтобы как-то помечать или запоминать элементы, которые нам уже встречались, у нас нет памяти – в списке могут быть гигабайты данных. Как быть?

Подразумений значительно меньше.



AlexL
12.01.2007, 23:57

Сегодня задали.

Есть некий связанный список, для которого определены две операции – перемещение на N элементов и получение текущего указателя.

Нужно определить закольцован этот список или нет, при условии что хранить позицию указателя нельзя.

ЗЫ Если интересно – продолжим с задачками :-)

Чудная задача. Убивал бы «преподавателей» эдакое задающих… Что то типа сферического коня в вакууме. А если по сути, все очень сильно зависит от языка реализации. В паскале можно определить по операции получения текущего указателя. Там при выходе за предел списка, получим null, а вот в C – программа просто грохнется при выходе за предел списка с core dump.



alx
12.01.2007, 23:58

сферического коня в вакууме

:)))))) Что это??



gosha
13.01.2007, 00:03

Парни, не удержался – нагуглил :smile: Но вы не сдавайтесь, решение действительно интересное. Только условие топикстартер поставил нечетко, я нашел его длиной в две строчки и яснее ясного.



alx
13.01.2007, 00:04

Парни, не удержался – нагуглил :smile: Но вы не сдавайтесь, решение действительно интересное. Только условие топикстартер поставил нечетко, я нашел его длиной в две строчки и яснее ясного.

Ну так давай нам условие! А то чего мы мозги парим.



AlexL
13.01.2007, 00:09

:)))))) Что это??

Это анегдот жутко старый. НИИ времен СССР. Задача построить вечный двигатель. Естественно, финансирование, сроки и т.д. Приходит коммисия, допустим, через 2 года. Как успехи, спрашивают. Отвечают, все хорошо, разаработки продвигаются.. А какая будет мощность вечного двигателя? – Вы знаете, пока не определили, но продвинулись в разработке единиц измерения, уже построена математическая модель сферического коня в вакууме…



gosha
13.01.2007, 00:10

Ну так давай нам условие! А то чего мы мозги парим.

Да в принципе все у него верно, просто избыточно, потому путает.

Есть односвязный список (

_ttp://ru.wikipedia.org/wiki/Линейный_список). По нему можно скакать на произвольное количество элементов. Для каждого элемента есть возможность получить указатель на него же (а как по другому-то), и использовать в качестве (читай вместо) идентификатора этого элемента. Надо определить, не закольцован ли список. Все просто. И решение красивое :yes:



alx
13.01.2007, 00:16

Да в принципе все у него верно, просто избыточно, потому путает.

Есть односвязный список (

_ttp://ru.wikipedia.org/wiki/Линейный_список). По нему можно скакать на произвольное количество элементов. Для каждого элемента есть возможность получить указатель на него же (а как по другому-то), и использовать в качестве (читай вместо) идентификатора этого элемента. Надо определить, не закольцован ли список. Все просто. И решение красивое :yes:

Увы, не прояснило.

Если бы список был у меня «в руках», так сказать, то я бы делал такое:

bool is_loop(Element *current_element)

{

while (current_element)

{

if (current_element->next == current_element)

return true;

current_element->next = current_element->next->next;

}

return false;

}

Эх…

Не выходит твоя чаша, Данила-мастер? (с)



AlexL
13.01.2007, 00:21

Да в принципе все у него верно, просто избыточно, потому путает.

Есть односвязный список (

_ttp://ru.wikipedia.org/wiki/Линейный_список). По нему можно скакать на произвольное количество элементов. Для каждого элемента есть возможность получить указатель на него же (а как по другому-то), и использовать в качестве (читай вместо) идентификатора этого элемента. Надо определить, не закольцован ли список. Все просто. И решение красивое :yes:

Позволю себе не согласиться. Не определен последний элемент списка. Т.е. указатель на следующий. Все зависит от языка реализации. В С, ежли список не замкнут и указатель последнего элемента не определен как null, все закончится core dump-ом.



Увы, не прояснило.

Если бы список был у меня «в руках», так сказать, то я бы делал такое:

bool is_loop(Element *current_element)

{

while (current_element)

{

if (current_element->next == current_element)

return true;

current_element->next = current_element->next->next;

}

return false;

}

Эх…

Не выходит твоя чаша, Данила-мастер? (с)

Да, в паскале таки будет работать. В С – нет.



alx
13.01.2007, 00:25

Позволю себе не согласиться. Не определен последний элемент списка. Т.е. указатель на следующий. Все зависит от языка реализации. В С, ежли список не замкнут и указатель последнего элемента не определен как null, все закончится core dump-ом.

Ну, типа список по определению заканчивается на null/nil, кроме случая закольцованности. Т.е. операция «получить указатель на следующий элемент» гарантированно возвращает либо элемент списка, либо 0. Ну, если список не битый.

Неоднозначность с этим вот «перемещением на произвольное количество элементов». Если я на последнем элементе сделал +1, то типа получил 0. А если сделал +2, то что получил?



gosha
13.01.2007, 00:25

Позволю себе не согласиться. Не определен последний элемент списка. Т.е. указатель на следующий. Все зависит от языка реализации. В С, ежли список не замкнут и указатель последнего элемента не определен как null, все закончится core dump-ом.

В этом-то вся и прелесть :yes: Неизвестно, то ли список большой, то ли зациклен. Но все-таки это список, все указатели на next валидные, т.е. ведут на другой элемент списка. А первых и последних нет, вбросили в середину и воюй как хочешь :laught:



alx
13.01.2007, 00:25

Да, в паскале таки будет работать. В С – нет.

Да и в паскале не будет. В коде ошибка.



gosha, все предложенные варианты – неправильные? Подтверди, плз. Тока true или false. Подсказывать не нужно ;)



gosha
13.01.2007, 00:29

gosha, все предложенные варианты – неправильные? Подтверди, плз. Тока true или false. Подсказывать не нужно ;)

Неправильные :yes: Могу дать очень очень очень тонкую подсказку.

Даже не подсказка это, а аналогия из жизни – может натолкнет :wink:

Из одного слова.



alx
13.01.2007, 00:31

Неправильные Могу дать очень очень очень тонкую подсказку. Даже не подсказка это, а аналогия из жизни – может натолкнет

Низя.



mas
13.01.2007, 01:36

если бы была хотя бы одна переменная, то все решалось бы просто – запомнили первый адрес, прыгнули на следующий элемент, получили его адрес, вычли из сохраненного предыдущего, прыгаем дальше, если в этой переменной после очередного вычитания 0, список зациклен, иначе просто доходим до конца.



alx
13.01.2007, 01:47

если бы была хотя бы одна переменная, то все решалось бы просто – запомнили первый адрес, прыгнули на следующий элемент, получили его адрес, вычли из сохраненного предыдущего, прыгаем дальше, если в этой переменной после очередного вычитания 0, список зациклен, иначе просто доходим до конца.

Неправильно, кажется. Похоже, по условиям «подразумевалось», что список может быть закольцован на любом элементе. Т.е. начальная позиция вне цикла, но если пойти дальше, то попадешь в цикл.

А так – можно было бы «запомнить» в аргументе ;)

void Func1(int a)

{

// любые операции с a

}



Func1(5);

Вот мы 5 «запомнили», хотя переменную не заводили, явного присваивания не делали, а воспользовались стеком.



mas
13.01.2007, 02:35

да, протупил, спать уже пора :)

тогда так – пускаем в одном цикле два итератора, один идет последовательно по списку, а второй прыгает через один, дальше после каждой итерации просто сравниваем адреса, если они совпадут (а в случае если есть зацикливание – они совпадут рано или поздно), то мы нашли зацикливание.



alx
13.01.2007, 03:35

да, протупил, спать уже пора :)

тогда так – пускаем в одном цикле два итератора, один идет последовательно по списку, а второй прыгает через один, дальше после каждой итерации просто сравниваем адреса, если они совпадут (а в случае если есть зацикливание – они совпадут рано или поздно), то мы нашли зацикливание.

Не тянет на красивое решение ;) Нада думать.



Кстати, итератор у нас один по условию ;)



gosha
13.01.2007, 12:11

Не тянет на красивое решение ;) Нада думать.

И тем не менее это оно :yes: Действительно, в случае закольцованности «быстрый» указатель догонит медленный.



Кстати, итератор у нас один по условию ;)

Не было такого условия. Было условие не хранить значения ранее пройденных указателей, а количество переменных никак не ограничивалось.



alx
13.01.2007, 13:39

И тем не менее это оно :yes: Действительно, в случае закольцованности «быстрый» указатель догонит медленный.

Над этим надо еще подумать.

Не было такого условия. Было условие не хранить значения ранее пройденных указателей, а количество переменных никак не ограничивалось.

Вот блин. По условию было две операции: взять текущий поинтер и передвинуть текущий поинтер. Т.е. типа так:

element *get_ptr();

void move_ptr(unsigned n);

Соответственно, итератор один.

Блин, задача с нехорошим подвохом, ИМХО :( Зря только копья ломали.



mas
13.01.2007, 14:03

По условию было две операции: взять текущий поинтер и передвинуть текущий поинтер.

да, но количество таких операций не ограничивалось (иначе при данных условиях она просто иметь решения не будет), хотя задачка и с подвохом ес-но



alx
13.01.2007, 14:08

Тогда нам нужно не только эти две операции, а вообще контроль над списком. А раз так, то мой вариант где-то там в начале также будет работать, только на одном итераторе ;)

Задачка не только с подвохом, а с западлом: нет четкого условия, а решений, соответственно, несколько, причем противоречивых.

Надеюсь, следующие задачки будут с по-человечески описанными условиями.



cleg
14.01.2007, 00:12

ну ладно. вот простая задачка. потому ответы – мне в личку или через асю.

(пусть другие тоже подумают)

два человека играют в игру. условия таковы:

есть две кучки спичек. в одной их 10000231, в другой 30023422.

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

впрос: каким по очереди лучше ходить, и как надо играть чтобы победить?

ЗЫ програмы не надо – простое словесное описание.



alx
14.01.2007, 00:15

Да ну, это ж классика.



cleg
14.01.2007, 23:10

хорошо. еще классика:

есть логический замок. он работает по след. принципу.

матрица 4х4 содержит в ячейках 0 или 1. за 1 шаг можно изменить значение одной ячейки, но при изменении ячейки, все ячейки, находящиеся с ней в одном столбце и в одном ряду меняются также на противоположне значение.

при закрывании все ячейки замка принимают случайное значение.

для открытия замка необходимо чтобы все его ячейки были равны 1.

составить программу для открытия любой комбинации замка.

второй вариант: то же, но за минимальное число ходов.



gosha
15.01.2007, 07:01

моСК сломал, практически :smile:

Если кто решил – не рассказывайте до вечера.

Кажется что-то такое мне приснилось, за день вспомню… наверное :laugh:

Ну, кроме как перебором (нахождение результирующей маски на основании «масок-операций») не придумывается. У всех так?



cleg
15.01.2007, 22:05

сразу говорю – перебор не пойдет!

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



alx
15.01.2007, 22:24

сразу говорю – перебор не пойдет!

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

Хорошенькое «сразу» через сутки :)

Почему перебор не пойдет? Есть обоснование?

Как по мне – придумывается целевая функция (например, количество нулей), ее минимизируем с помощью перебора, отсеиваем зацикливания с помощью учета предыдущих вариантов.



gosha
15.01.2007, 22:25

сразу говорю – перебор не пойдет!

Не пойдет, потому что нельзя по условию? Все равно же будет найден самый короткий путь :yes: Причем не так много проходов. Рекурсия на 16 «нырков» максимум, а потом отсеиваем «мертвые» ветки решений.

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

Осталось только решить какую из многих :smile: Выбор стратегии как раз и проблема :smile: И возврат в исходное положение остальных… :upset: не думаю что это будет самая оптимальная по количеству ходов стратегия. То, что ее можно реализовать сгрупировав маски ходов – в этом я уверен, хоть и не раскладывал еще этот квадрат, но нужно ли?

ЗЫ Тем более смысл менять одну конкретную ячейку? Представь последний ход в складывании квадрата – там семь нулей. Как и зачем ты будешь один конкретный ноль закрывать?



alx
15.01.2007, 22:32

Рекурсия на 16 «нырков» максимум, а потом отсеиваем «мертвые» ветки решений.

Чего-то мало. Ты что рекурсией будешь искать? Последовательность «ходов». А откуда знаешь, что их будет 16 или меньше?



gosha
15.01.2007, 22:36

Чего-то мало. Ты что рекурсией будешь искать? Последовательность «ходов». А откуда знаешь, что их будет 16 или меньше?

Ща нарисую, несколько минут :smile:



Вот квадрат. Даем номера ячейкам и растягиваем в цепочку (не важно откуда нумеровать)

Получается, что число, описывающее состояние нашего квадрата (в соответствии с нашей разметкой) это:

1110010110111010 (58810)

Тогда наш «ход» (помечен жирной границей и зеленым квадратом в центре) это XOR маска к этому числу:

0010001011110010 (8946)

Всего таких ходов-масок 16. Понятно, что мы их складываем в массив чисел, и наша маска из примера лежит там под индексом 10.

Чтобы получить из исходного квадрата

1110010110111010 (58810), заполненный

1111111111111111 (65535), нужно к нему применить маску

0001101001000101 (6725).

Ну вот, теперь задача сводится к тому, чтобы перебрать ходы-маски, перексорить их друг с другом таким образом, чтобы получилась результирующая маска (6725). Это цикл по массиву ходов-масок с рекурсивным уходом в такой же цикл и т.д.

Почему я думаю что не больше 16(15) ходов – ну их всего 16, два раза одну и ту же маску на число накладывать бесполезно, это все равно что ни разу не наложил. Вот, собсно, мое ИМХО. Писать саму прогу не стал, бо лень :laught: Тем более задача небось олимпиадная, для школьников, а если я прав с решением – не фиг им на шару тут сорцы качать :bebebe: Пусть сами мучаются. Хотя, сам код получается очень небольшим, подготовительной работы больше (и аккуратности требует большой) :yes: А то потом решение будет до скончания века искаться… При условии, конечно, если я сам нигде не ошибся :)



cleg
15.01.2007, 23:38

эта задача была на республике лет 7 или 8 назад…

а вот где я ее встретил – не скажу! :-)

а ходов больше 16… так что рекурсия пойдет, но не так весело



gosha
15.01.2007, 23:44

а ходов больше 16… так что рекурсия пойдет, но не так веселоХочется поспорить но не стану :laught: Первое длинное решение не обязательно единственное.



cleg
15.01.2007, 23:46

рекурсия не пойдет так как не быстро при некоторых условиях…

ты ветки по какому условию отсекать будешь???



alx
15.01.2007, 23:46

Гоша, ты немного не прав. Представь себе абстрактный ход в ячейку 5. Потом в ячейку 6. Возможен ли вариант, что нужно будет походить опять в ячейку 5? По-моему – очень возможен, ведь ситуация на поле после хода в 6 сильно изменилась, и два разных хода в 5 приведут к разным результатам. Типа в одну реку дважды не войдешь ;) И ходов до финала может быть значительно больше 16.

По-ходу, это такой двухмерный кубик Рубика ;) А этот кубик складывается в общем случае за 50 с чем-то ходов или меньше (не уверен, что правильно помню). Может быть, здесь предел – 16. Но мы этого не знаем, а значит не можем использовать. И при прямом переборе могут выстраиваться очень длинные цепочки.



gosha
15.01.2007, 23:51

Гоша, ты немного не прав. Представь себе абстрактный ход в ячейку 5. Потом в ячейку 6. Возможен ли вариант, что нужно будет походить опять в ячейку 5? По-моему – очень возможен, ведь ситуация на поле после хода в 6 сильно изменилась, и два разных хода в 5 приведут к разным результатам. Типа в одну реку дважды не войдешь ;) И ходов до финала может быть значительно больше 16.

Ситуация на поле конечно измениться :yes: И может быть такое начало/продолжение приведет к решению. Но не факт, что к самому быстрому решению. И возможно, для этого придется еще раз (третий) ходить в ячейку 5. Надо проверять… а лень :laught:



alx
15.01.2007, 23:53

Ситуация на поле конечно измениться :yes: И может быть такое начало/продолжение приведет к решению. Но не факт, что к самому быстрому решению. И возможно, для этого придется еще раз ходить в ячейку 5. Надо проверять… а лень :laught:

Ну да, вот ежели бы cleg приз какой учередил ценный, тот тут бы решателей уже было бы море ;)

добавлено через 32 секунды

сразу говорю – перебор не пойдет!

Так почему перебор не пойдет?



cleg
15.01.2007, 23:54

хахаха!

за приз я бы и сам поборолся (выиграл же самсунг Д900, но это офф).

если тока спонсор найдеццо.



Unknown_2
18.01.2007, 13:28

задачка старая :))

впервые столкнулся с ней в гаме «следствие ведут знатоки», чи как там её.

суть в том чтобы 2 раза переключить все однотипные ячейки.

тоесть шаг один (это например)

запоимнаем все «1″ (или «0″ – пофиг)

Шаг 2:

переключаем все ячейки запомненые на шаге 1

Шаг 3: повторяем шаги 1 и 2 еще раз.

месли нигде не ошибся то кажется так делалось.

я для простототы всегда старался «почти собрать» перед шагом 1, но это так – для визуального удобства чтобы в голове меньше ячеек держать. :)

когда реализовывал это на паскакале узнал что есть даже официальное название алгоритма :) правда не помню какое :)

(когда я его «изобрёл» он был не таким красивым, и имел много лишнего)



Найти информацию?

Используйте форму ниже, чтобы начать поиск по сайту:

Не нашли то что искали? Напишите мне на почту, возможно я помогу найти Вам необходимую информацию!

Сыылки на полезные сайты!

Тут будут публиковаться ссылки на интересные ресурсы по теме...