Ещё одна задачка для ума :)
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.217.37] |
|
|
правила раздела Алгоритмы

Ещё одна задачка для ума :)
|
Сообщ.
#1
,
|
|
|
|
Вот вспомнил, как два дня потратил на один алгоритмик (день вспоминал школьный курс тригонометрии, день отлаживал). Стало интересно, а на сколько мой алгоритм компактен. Посему предлагаю Вам реализовать сей алгоритм и показать мне результаты, а потом я приведу своё решение и вместе сравним
![]() Итак, должна быть функция, имеющая на входе всего один параметр - количество кружков (цифры в кружках не имеют значение). Функция должна рисовать примерно следующее (см. картинки), в зависимости от кол-ва кружков. Соответственно, если на входе еденица, то должен быть нарисован просто кружок. Для наглядности привожу результат работы функции с входным значением 3: [img width=229 height=243]http://www.sources.ru/download/bas1.gif[/img] и входным значением 5: [img width=261 height=252]http://www.sources.ru/download/bas2.gif[/img] ЗЫ: это не просьба решить задачу, это для тех у кого серое вещество простаивает ![]() |
|
Сообщ.
#2
,
|
|
|
|
можно я на сях:
void func(int n) { for(int i=0;i<n-1;i++) for(int j=i+1;j<n;j++) draw(i,j); // draw from i to j && j to i } |
|
Сообщ.
#3
,
|
|
|
|
Увы, эта задачка решается оптимально при любом методе
![]() Дело в том, что любой правильный алгоритм вызовет процедуру draw (N^2-N)/2 раз. Так что и трудоемкость у них будет одинаковая. |
|
Сообщ.
#4
,
|
|
|
|
забыл добавить, что стрелочки надо рисовать именно так, как на рисунках
![]() |
|
Сообщ.
#5
,
|
|
|
|
То есть как это? По какому закону?
|
|
Сообщ.
#6
,
|
|
|
|
ну а если тебе ничего не скажут про законы, то ты не сможешь родить алгоритм ?
![]() Тыкс ... у меня ощущение, что я плохо разъяснил задачу. Ну представим, что две вышеприведённые картинки я нарисовал от руки. А слабо сварганить такую функцию, которая нарисует тоже самое ? |
|
Сообщ.
#7
,
|
|
|
|
А что там особенного в расположении стрелочек???
Каждый кружок связан со всеми остальными |
|
Сообщ.
#8
,
|
|
|
|
та ничего особенного в расположении стрелочек нет
![]() и не нада делать такую удивлённую причёску ![]() |
|
Сообщ.
#9
,
|
|
|
|
Да не, ну просто народ удивляется...
А насчет программы, я может напишу да пришлю как-нибудь, если хочешь... Только я думаю, что все присланые программы будут суть одно и то же... |
|
Сообщ.
#10
,
|
|
|
|
понятно, что набор тригонометрических уравнений будет одинаков. Но мне интересны организация циклов и оптимизация, так как у меня не было времени на оптимизацию.
|
|
Сообщ.
#11
,
|
|
|
|
Можно через векторы делать (и аффинные преобразования векторов).
- делаешь массив векторов для центров кружков - задаешь координаты центра первого кружка (вектор) относительно центра координат. - рассчитываешь угол поворота 2Pi/n - делаешь матрицу поворота (два на два для плоскости) на полученый угол - в цикле умножаешь i-тый вектор на матрицу, получается новый вектор (центр кружка i+1) из тригонометрии только sin(2Pi/n) и cos(2Pi/n) при создании матрицы поворота |
|
Сообщ.
#12
,
|
|
|
|
на самом деле задача - фигня, но способов её решения я вижу несколько
![]() 1) рассчитывать координаты каждого кружка и сразу рисовать 2) запихнуть в массив координаты вершин правильного н-угольника и передать этот массив функции, которая всё сразу нарисует ![]() имхо второй способ будет работать быстрее -) |