Array140. Дано множество $$A$$ из $$N$$ точек с целочисленными координатами x, y. Порядок на координатной плоскости определим следующим образом: $$(x_1, y_1) \lt (x_2, y_2)$$, если либо $$x_1 + y_1 \lt x_2 + y_2$$, либо $$x_1 + y_1 = x_2 + y_2$$ и $$x_1 \lt x_2$$. Расположить точки данного множества по убыванию в соответствии с указанным порядком.
Решение:
Добавил процедуру Swap, которая меняет местами значения. x1 c x2 и y1 c y2.
И функцию Compare булевого типа, которая сравнивает «точки» по указанному в задаче алгоритму и в случе если (x1,y1)<(x2,y2) выводит True если нет то False.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
program Array140; var A: array [1..10,1..2] of real; N,N2,i,i2,i3: integer; Procedure Swap(var X1, Y1, X2, Y2 :Real); begin X1:=X1+X2; X2:=X1-X2; X1:=X1-X2; Y1:=Y1+Y2; Y2:=Y1-Y2; Y1:=Y1-Y2; end; Function Compare(X1,Y1, X2, Y2:real):boolean; begin if (x1+y1<x2+y2) or ((x1+y1=x2+y2) and (x1<x2)) then Compare:=True else Compare:=False; end; begin Write('N: '); Readln(N); Writeln('A: '); for i:=1 to N do begin write(i,'.x :'); readln(a[i,1]); write(i,'.y :'); readln(a[i,2]); end; N2:=N; for i:=1 to N-1 do begin i2:=1; N2:=N2-1; while (i2<=N2) do begin if Compare(A[i2+1,1],A[i2+1,2],A[i2,1],A[i2,2]) then Swap(A[i2+1,1],A[i2+1,2],A[i2,1],A[i2,2]); inc(i2); end; end; for i:=1 to N do writeln(a[i,1]:7:0,' : ',a[i,2]:7:0); end. |
Задачи из раздела Array можно посмотреть здесь.
В моем коде сортировка по возрастанию. Чтобы программа сортировала по убыванию нужно заменить код в строках с 20 по 31 на: