![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 09.02.2012
Сообщений: 12
|
![]() Задан некий прямоугольник (квадрат - частный случай) со сторонами n и m. Левая верхняя точка имеет координаты х=0, у=0. Нижняя правая точка прямоугольника имеет координаты х=n, y=m. Требуется заполнить прямоугольник точками в строгой последовательности, начиная от точки х=0,у=0 к точкам x=n, y=m. Последовательность такая: например, для прямоугольника со сторонами n=7, m=4 (8x5=40 точек): 01. x=0 y=0 02. x=1 y=0 03. x=0 y=1 04. x=2 y=0 05. x=1 y=1 06. x=0 y=2 07. x=3 y=0 08. x=2 y=1 09. x=1 y=2 10. x=0 y=3 11. x=4 y=0 12. x=3 y=1 13. x=2 y=2 14. x=1 y=3 15. x=0 y=4 16. x=5 y=0 17. x=4 y=1 18. x=3 y=2 19. x=2 y=3 20. x=1 y=4 21. x=6 y=0 22. x=5 y=1 23. x=4 y=2 24. x=3 y=3 25. x=2 y=4 26. x=7 y=0 27. x=6 y=1 28. x=5 y=2 29. x=4 y=3 30. x=3 y=4 31. x=7 y=1 32. x=6 y=2 33. x=5 y=3 34. x=4 y=4 35. x=7 y=2 36. x=6 y=3 37. x=5 y=4 38. x=7 y=3 39. x=6 y=4 40. x=7 y=4 Требуется разработать алгоритм оптимизации кода, чтобы он имел как можно меньше строк. В данном примере приведен примитивный случай, когда стороны прямоугольника имеют небольшие значения. Значения на самом деле могут быть очень большими, например, n=3000, m=2000. Ширина прямоугольника может быть меньше высоты. Максимальный размер прямоугольника 32767х32748 пикселей. |
![]() |
![]() |
![]() |
#2 | |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,543
|
![]() Цитата:
универсальный алгоритм оптимизации любого кода тянет на нобелевскую премию. базовый цикл заполнения Код:
их можно либо включить в границы цикла, либо проверять внутри. Для оптимизации по ТЗ написать все в одну строчку! Код:
программа — запись алгоритма на языке понятном транслятору
|
|
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 09.02.2012
Сообщений: 12
|
![]()
виноват, неправильно выразился, здесь конечно не оптимизация кода, а оптимизация алгоритма;
спасибо большое, код прекрасно работает! а проверка простая, внутри цикла делаем проверку: if (x<=n) and (y<=m) then вывести точку; ---------------- здесь возникает еще один вопрос, а каким будет код, если нужно сделать диагональное заполнение прямоугольника, например, из правого верхнего угла в левый нижний угол? от точек (x=n, y=0) к точкам (x=0, y=m)? может подскажите? |
![]() |
![]() |
![]() |
#4 | |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,543
|
![]() Цитата:
хотя нет. понял что вы имели в виду. Код:
для обратных диагоналей (первая задача) число =m+n для обычных тоже вот и ошибка в приведенном выше коде! а может и нет? 2. перебор элементов на данной диагонали (по какой-либо координате) 3. вычисление второй координаты по номеру диагонали и первой координате.
программа — запись алгоритма на языке понятном транслятору
Последний раз редактировалось evg_m; 17.02.2012 в 13:31. |
|
![]() |
![]() |
![]() |
#5 |
Пользователь
Регистрация: 09.02.2012
Сообщений: 12
|
![]()
к сожалению, этот код не работает, вернее работает, но наполовину; доходит только до диагонали с точкой х=0, у=0 и останавливается;
у меня получился вот такой код: for j:=n downto -m do for x:=j to n+m do begin y:=x-j; if (x<=n) and (y<=m) then вывести точку с координатами (х, у); end; |
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 09.02.2012
Сообщений: 12
|
![]()
и еще один вопрос...
диагональное заполнение, получилось не такое уж и сложное, а вот как заполнить прямоугольник радиально? например, возьмем произвольную точку на прямоугольнике пусть она будет (х=n/2, y=m/2), требуется запольнить прямоугольник радиально от этой точки к краям прямоугольника, например заполнение точками может происходить так: 01. x=i y=j (i=n/2, j=m/2) 02. x=i+1 y=j 03. x=i+1 y=j+1 04. x=i y=j+1 05. x=i-1 y=j+1 06. x=i-1 y=j 07. x=i-1 y=j-1 08. x=i y=j-1 09. x=i+1 y=j-1 10. x=i+2 y=j-1 11. x=i+2 y=j 12. x=i+2 y=j+1 13. x=i+2 y=j+2 14. x=i+1 y=j+2 15. x=i y=j+2 16. x=i-1 y=j+2 17. x=i-2 y=j+2 18. x=i-2 y=j+1 19. x=i-2 y=j 20. x=i-2 y=j-1 21. x=i-2 y=j-2 22. x=i-1 y=j-2 23. x=i y=j-2 24. x=i+1 y=j-2 25. x=i+2 y=j-2 26. x=i+3 y=j-2 и т.д. |
![]() |
![]() |
![]() |
#7 |
Форумчанин
Регистрация: 26.07.2009
Сообщений: 489
|
![]()
VyachNik, может лучше использовать методы FillRect или Rectage? С какой целью, необходимо по-пиксельно заполнять прямоугольную область в определенной последовательности? или это какой-нибудь курсовой проект?
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
Последний раз редактировалось chertovich; 21.02.2012 в 00:21. |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Методы оптимизации кода | FiloXSee | Общие вопросы C/C++ | 33 | 09.06.2011 09:06 |
Создание алгоритма по коду | Egor2 | Помощь студентам | 3 | 21.03.2011 19:51 |
Соответствие алгоритма и кода | @Manya@ | Общие вопросы C/C++ | 0 | 08.05.2010 15:45 |
Нужна помощь в поиске алгоритма оптимизации | LastAC | Помощь студентам | 0 | 08.04.2009 00:49 |