A:点排序
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
-
给定一个点的坐标(x, y),在输入的n个点中,依次计算这些点到指定点的距离,并按照距离进行从小到大排序,并且输出点的坐标(如果距离相同,将x轴坐标比较小的点排到前面, 如果距离相等且x轴坐标也相同,则将y轴坐标较小的点排到前面)。坐标为int类型,范围为-1000到1000。n 为1到100之间正整数。
- 输入
- 3行,第一行为指定点的坐标x, y。x, y之间用空格隔开。第二行为一个整数n。第三行为n个点的坐标,彼此之间用空格间隔。
- 输出
- 按照距离进行从小到大排序,输出点的坐标(如果距离相同,将x轴坐标比较小的点排到前面,如果距离相等且x轴坐标也相同,则将y轴坐标较小的点排到前面)。注意输出中同一个点内部括号中无空格,点和点之间逗号后面存在空格。
- 样例输入
-
0 0
5
1 0 0 1 1 1 5 2 4 0 - 样例输出
-
(0,1), (1,0), (1,1), (4,0), (5,2)
代码:#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
struct point
{
int pos_x;
int pos_y;
int distance;
};
int main()
{
int pos_x1,pos_y1;
struct point pos[];
int n,i,j;
cin>>pos_x1>>pos_y1;
cin>>n;
for(i=;i<n;i++)
{
cin>>pos[i].pos_x>>pos[i].pos_y;
pos[i].distance=;
}
for(j=;j<n;j++)
{
pos[j].distance=sqrt((pos[j].pos_x-pos_x1)*(pos[j].pos_x-pos_x1)+(pos[j].pos_y-pos_y1)*(pos[j].pos_y-pos_y1));
}
struct point temp;
for(i=;i<n-;i++)
{
for(j=;j<n--i;j++)
{
if(pos[j].distance>pos[j+].distance)
{
temp=pos[j];
pos[j]=pos[j+];
pos[j+]=temp;
}
}
}
for(i=;i<n-;i++)
{
for(j=;j<n--i;j++)
{
if((pos[j].distance==pos[j+].distance)&&(pos[j].pos_x>pos[j+].pos_x))
{
temp=pos[j];
pos[j]=pos[j+];
pos[j+]=temp;
}
else
if((pos[j].distance==pos[j+].distance)&&(pos[j].pos_x==pos[j+].pos_x)&&(pos[j].pos_y>pos[j+].pos_y))
{
temp=pos[j];
pos[j]=pos[j+];
pos[j+]=temp;
}
}
}
for(i=;i<n;i++)
{
printf("(%d,%d) ",pos[i].pos_x,pos[i].pos_y);
}
cout<<endl;
return ;
}