Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.02.2012, 13:08   #1
VyachNik
Пользователь
 
Аватар для VyachNik
 
Регистрация: 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 пикселей.

VyachNik вне форума Ответить с цитированием
Старый 09.02.2012, 13:35   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

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

базовый цикл заполнения
Код:
for j:=0 to m+n do begin
  for x:=0 to j do begin
    y:=j-x;
  end;
end;
и проверки (расчеты) на 0<=x <=n 0<=y<=m
их можно либо включить в границы цикла, либо проверять внутри.
Для оптимизации по ТЗ написать все в одну строчку!
Код:
or j:=0 to m+n do begin for x:=0 to j do begin  y:=j-x;  end; end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 17.02.2012, 12:52   #3
VyachNik
Пользователь
 
Аватар для VyachNik
 
Регистрация: 09.02.2012
Сообщений: 12
По умолчанию

виноват, неправильно выразился, здесь конечно не оптимизация кода, а оптимизация алгоритма;
спасибо большое, код прекрасно работает!
а проверка простая, внутри цикла делаем проверку:
if (x<=n) and (y<=m) then
вывести точку;

----------------

здесь возникает еще один вопрос, а каким будет код, если нужно сделать диагональное заполнение прямоугольника, например, из правого верхнего угла в левый нижний угол? от точек (x=n, y=0) к точкам (x=0, y=m)?
может подскажите?
VyachNik вне форума Ответить с цитированием
Старый 17.02.2012, 12:59   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
а каким будет код, если нужно сделать диагональное заполнение прямоугольника
а разве мы не это делали?
хотя нет. понял что вы имели в виду.
Код:
for j:=max(n,m) downto 0 do //перебор стартовых позиций для одной из координат (x) ДИАГОНАЛЕЙ
  for x:=j to max(n,m) do //перебор этой координаты от стартовой позиции до заведомо выходящий. ЭЛЕМЕНТОВ НА ДИАГОНАЛИ
     y:=x-j; // определение второй координаты (y) по стартовой и текущей позиции (x)
//проверка (x; y) вхождения
end;
1. перебор диагоналей for j:=
для обратных диагоналей (первая задача) число =m+n
для обычных тоже вот и ошибка в приведенном выше коде! а может и нет?

2. перебор элементов на данной диагонали (по какой-либо координате)
3. вычисление второй координаты по номеру диагонали и первой координате.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 17.02.2012 в 13:31.
evg_m вне форума Ответить с цитированием
Старый 17.02.2012, 21:20   #5
VyachNik
Пользователь
 
Аватар для VyachNik
 
Регистрация: 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;
VyachNik вне форума Ответить с цитированием
Старый 20.02.2012, 23:05   #6
VyachNik
Пользователь
 
Аватар для VyachNik
 
Регистрация: 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
и т.д.
VyachNik вне форума Ответить с цитированием
Старый 21.02.2012, 00:18   #7
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

VyachNik, может лучше использовать методы FillRect или Rectage? С какой целью, необходимо по-пиксельно заполнять прямоугольную область в определенной последовательности? или это какой-нибудь курсовой проект?
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.

Последний раз редактировалось chertovich; 21.02.2012 в 00:21.
chertovich вне форума Ответить с цитированием
Старый 21.02.2012, 17:42   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
а вот как заполнить прямоугольник радиально?
Не понял.
приведенный пример похож на заполнение по спирали. ответ тут
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Методы оптимизации кода 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