![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
![]()  | 
	
	
| 
		 | 
	Опции темы | Поиск в этой теме | Опции просмотра | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Задан некий прямоугольник (квадрат - частный случай) со сторонами 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  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Вот, написал на коленке за пять минут 
		
	
		
		
		
		
		
	
		
		
	
	
	   - не проверял   Код: 
	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  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 спасибо, код работает! 
		
	
		
		
		
		
		
	
		
		
	
	
	проверку можно так сделать: if (x<=n) and (y<=m) then вывести точку с координатами (х,у);  | 
| 
		 
			 
			#4  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 а как будет выглядеть код, если немножко изменить условие задачи, например, нам нужно заполнить этот же прямоугольник диагоналями, идущими от точки (х=0, у=m) к точке (х=n, y=0), то есть от левого нижнего угла к правому верхнему углу? (диагонали перпендикулярны прямой, на которой лежат эти точки) 
		
	
		
		
		
		
		
	
		
		
	
	
	может подскажите?  |