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$$. Расположить точки данного множества по убыванию в соответствии с указанным порядком.
Решение:
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 50 |
#include <stdio.h> #include <math.h> void swap(float a1[], float a2[]){ a1[0]+=a2[0]; a2[0]=a1[0]-a2[0]; a1[0]-=a2[0]; a1[1]+=a2[1]; a2[1]=a1[1]-a2[1]; a1[1]-=a2[1]; } int compare (float a1[], float a2[]){ if ((a1[0]+a1[1]<a2[0]+a2[1])||((a1[0]+a1[1]==a2[0]+a2[1]) && (a1[0]<a2[0]))) return 1; else return 0; } int main(void) { float a[10][2]; int n; printf("N: "); scanf("%i",&n); int i; for (i=0; i<n; ++i){ printf("a[%i]:\n",i+1); printf(" x : "); scanf("%f",&a[i][0]); printf(" y : "); scanf("%f",&a[i][1]); } int i2, n2=n; for (i=0; i<n-1;i++){ --n2; for (i2=0; i2<n2; i2++) if (compare(a[i2+1],a[i2])==0){ swap(a[i2+1], a[i2]); } } for (i=0; i<n;i++) printf("A %i :\n x: %f\n y: %f\n",i+1 , a[i][0],a[i][1]); return 0; } |
Другие задачи из раздела Array можно посмотреть здесь.
Комментарии: