# PBinfo #931 – SortareUnghi – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: Darius

## Enunț

Cerința
Se dau puncte distincte în plan. Asociem fiecărui punct semidreapta care pornește din originea sistemului de coordonate și trece prin acel punct. Să se afișeze punctele în ordine crescătoare a unghiului pe care semidreapta asociată îl face cu semidreapta spre plus infinit a axei OX. Dacă două unghiuri sunt egale se va afișa punctul cel mai apropiat de origine.

Date de intrare
Fișierul de intrare sortareunghi.in conține pe prima linie n, reprezentând numărul de puncte. Pe următoarele n linii se găsesc câte două numere separate printr-un spațiu, reprezentând abscisa respectiv ordonata câte unui punct.

Date de ieșire
Fișierul de ieșire sortareunghi.out va conține n linii cu câte două numere separate prin câte un spațiu, reprezentând abscisa respectiv ordonata câte unui punct, în ordinea cerută.

Restricții și precizări

1 ≤ n ≤ 100
Numerele din fișierul de intrare sunt întregi cuprinse între -1001 și 1001.
Unghiurile sunt în intervalul [0,360).
 Punctul (0,0)@ nu se găsește în fișierele de intrare

Exemplu:
sortareunghi.in

3
1 1 
-1 -1 
-1 1
sortareunghi.out

1 1
-1 1
-1 -1

## Cod sursă C++

```cpp
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin ("sortareunghi.in");
ofstream fout("sortareunghi.out");
pair<int, int> v[103];
int n, i;
int cadran(int x, int y) {
    if (x > 0 && y >= 0)
        return 1;
    if (x >= 0 && y<0)
        return 4;
    if (y > 0 && x <= 0)
        return 2;
    return 3;
}
int det(int X1, int Y1, int X2, int Y2, int X3, int Y3) {
    return (X2-X1)*(Y3-Y1) - (X3-X1)*(Y2-Y1);
}
int cmp(const pair<int, int> &a, const pair<int, int> &b) {
    int c1 = cadran(a.first, a.second);
    int c2 = cadran(b.first, b.second);
    if (c1 != c2)
        return c1 < c2;
    else {
        int d = det(0, 0, a.first, a.second, b.first, b.second);
        if (d != 0)
            return d > 0;
        else
            return a.first*a.first + a.second*a.second < b.first*b.first + b.second*b.second;
    }
}
int main() {
    fin>>n;
    for (i=1;i<=n;i++)
        fin>>v[i].first>>v[i].second;
    sort(v+1, v+n+1, cmp);
    for (i=1;i<=n;i++)
        fout<<v[i].first<<" "<<v[i].second<<"\n";
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/931)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/931/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-931/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
