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
și1001
. - 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
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema SortareUnghi:
#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<<"
";
return 0;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #931 SortareUnghi
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #931 SortareUnghi de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!