阿生的粉丝团
题目描述:
夭折了,阿生竟然有粉丝团了,而且还是清一色的妹子。激动的阿生忍不住咬了自己一下,确定一下不是梦,好吧,还真是个梦。醒来的阿生悲痛欲绝,只想知道梦境中她们平面坐标的逆时针排列,你能帮帮他吗。
输入描述:
输入每行给出一组整数x,y代表梦境中阿生粉丝的平面坐标,并且保证第一个的坐标永远是(0 0): -1000= x <= 1000, -1000<= y <= 1000
输出描述:
按照(%d,%d)的格式输出即可。
输入样例:
0 0
70 -50
60 30
-30 -50
80 20
50 -60
90 -20
-30 -40
-10 -60
90 10
输出样例:
(0,0)
(-30,-40)
(-30,-50)
(-10,-60)
(50,-60)
(70,-50)
(90,-20)
(90,10)
(80,20)
(60,30)
解题思路:
这题的本质是结构体排序,先输出原点(0,0),然后从第三象限开始逆时针旋转,若是不同象限的坐标按照三四一二象限的顺序来排序,若是同一象限的坐标则按照y/x的大小来升序排列,最后输出即可。
AC代码:
#include <bits/stdc++.h>
using namespace std;
#define Up(i,a,b) for(int i = a; i <= b; i++)
struct dot
{
int x,y;
int level; //象限,第三象限1,第四象限2,第一象限3,第二象限4
};
bool cmp(dot d1,dot d2)
{
if(d1.level != d2.level)
{
return d1.level < d2.level;
}
else
{
double _1 = d1.y*1.0/d1.x;
double _2 = d2.y*1.0/d2.x;
return _1 < _2;
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
vector<dot> v;
int x,y;
while(cin >> x >> y)
{
if(x && y) //(0,0)除外
{
int level;
if(x>0 && y>0) //第一象限
{
level = 3;
}
else if(x>0 && y<0) //第四象限
{
level = 2;
}
else if(x<0 && y<0) //第三象限
{
level = 1;
}
else //x<0 && y>0 //第二象限
{
level = 4;
}
v.push_back({x,y,level});
}
//if(x==90 && y == 10) break; //测试样例的时候用
}
sort(v.begin(),v.end(),cmp);
cout << "(0,0)" << endl;
for(auto it : v)
{
printf("(%d,%d)\n",it.x,it.y);
}
return 0;
}
来自生哥的官方题解:
生哥太强了,代码简洁精练,我还没开始main函数,生哥就已经AC了。
#include <bits/stdc++.h>
using namespace std;
struct p{
int x,y;
p():x(0),y(0) {}
p(int x,int y)
{
this->x = x;
this->y = y;
}
}ls[10001];
bool cmp(p a,p b){
return a.x*b.y - a.y*b.x>0;
}
int main(){
int x,y,n = 0;
while(cin>>x>>y){
ls[n++]=p(x,y);
if(x==90&&y==10) break;
}
sort(ls,ls+n,cmp);
for(int i = 0;i<n;++i){
cout<<"("<<ls[i].x<<","<<ls[i].y<<")"<<endl;
}
return 0;
}
还没有任何评论,你来说两句吧!