Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.02.2012, 13:22
Аватар для VyachNik
VyachNik VyachNik вне форума
Прохожий
 
Регистрация: 09.02.2012
Сообщения: 5
Репутация: 10
Вопрос Создание алгоритма оптимизации кода

Задан некий прямоугольник (квадрат - частный случай) со сторонами 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  
Старый 09.02.2012, 18:07
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Вот, написал на коленке за пять минут - не проверял

Код:
var
  Sum:Integer;
  X,Y:Integer;

for Sum := 0 to (N+M) do begin
  for Y:=0 to Sum do begin
     X:= Sum-Y;

    if X<0 then Continue;
    if Y<0 then Continue;
    if X>=N then Continue;
    if Y>=M then Continue;

   DoSomeg(X,Y);


  end;
end;
Ответить с цитированием
Этот пользователь сказал Спасибо icWasya за это полезное сообщение:
VyachNik (17.02.2012)
  #3  
Старый 17.02.2012, 22:41
Аватар для VyachNik
VyachNik VyachNik вне форума
Прохожий
 
Регистрация: 09.02.2012
Сообщения: 5
Репутация: 10
По умолчанию

спасибо, код работает!
проверку можно так сделать:

if (x<=n) and (y<=m) then
вывести точку с координатами (х,у);
Ответить с цитированием
  #4  
Старый 17.02.2012, 22:55
Аватар для VyachNik
VyachNik VyachNik вне форума
Прохожий
 
Регистрация: 09.02.2012
Сообщения: 5
Репутация: 10
По умолчанию

а как будет выглядеть код, если немножко изменить условие задачи, например, нам нужно заполнить этот же прямоугольник диагоналями, идущими от точки (х=0, у=m) к точке (х=n, y=0), то есть от левого нижнего угла к правому верхнему углу? (диагонали перпендикулярны прямой, на которой лежат эти точки)
может подскажите?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:16.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter