#include #include #define VODOROVNE 0 #define SVISLE 1 #define X 0 #define Y 1 typedef struct bod_t { int souradnice[ 2 ]; struct bod_t *sousedi[ 2 ]; } bod_t; int co[ 2 ] = { X, Y };//Kterým směrem se porovnává int porovnej( const void *_1, const void *_2 ) {//Lexikografické porovnání podle pořadí definovaného v co bod_t * const *a = _1, * const *b = _2; if( (*a)->souradnice[ co[ 0 ] ] == (*b)->souradnice[ co[ 0 ] ] ) return (*a)->souradnice[ co[ 1 ] ] - (*b)->souradnice[ co[ 1 ] ]; else return (*a)->souradnice[ co[ 0 ] ] - (*b)->souradnice[ co[ 0 ] ]; } bod_t *sparuj( int n, bod_t *body ) {//Utvoří dvojice podle nastavení v co bod_t *pozice[ n ]; for( int i = 0; i < n; ++ i ) pozice[ i ] = &body[ i ]; qsort( pozice, n, sizeof *pozice, porovnej ); for( int i = 1; i < n; i += 2 ) { pozice[ i ]->sousedi[ co[ 1 ] ] = pozice[ i - 1 ]; pozice[ i - 1 ]->sousedi[ co[ 1 ] ] = pozice[ i ]; } return pozice[ 0 ]; } int main( void ) { int n; scanf( "%d", &n ); bod_t body[ n ]; for( int i = 0; i < n; ++ i ) { scanf( "%d%d", &body[ i ].souradnice[ X ], &body[ i ].souradnice[ Y ] ); } sparuj( n, body );//Svisle co[ 0 ] = Y; co[ 1 ] = X; bod_t *akt = sparuj( n, body ), *start = akt;//Vodorovně a ulož první int smer = VODOROVNE; do {//Obejdi printf( "%d %d\n", akt->souradnice[ X ], akt->souradnice[ Y ] ); akt = akt->sousedi[ smer ]; smer = ( smer + 1 ) % 2; } while( akt != start ); return 0; }