1. 程式人生 > >A:點排序-poj

A:點排序-poj

相同 else 輸入 坐標 poj pre 範圍 pri include

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[101
]; int n,i,j; cin>>pos_x1>>pos_y1; cin>>n; for(i=0;i<n;i++) { cin>>pos[i].pos_x>>pos[i].pos_y; pos[i].distance=0; } for(j=0;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=0;i<n-1;i++) { for(j=0;j<n-1-i;j++) { if(pos[j].distance>pos[j+1].distance) { temp=pos[j]; pos[j]=pos[j+1]; pos[j+1]=temp; } } } for(i=0;i<n-1;i++) { for(j=0;j<n-1-i;j++) { if((pos[j].distance==pos[j+1].distance)&&(pos[j].pos_x>pos[j+1].pos_x)) { temp=pos[j]; pos[j]=pos[j+1]; pos[j+1]=temp; } else if((pos[j].distance==pos[j+1].distance)&&(pos[j].pos_x==pos[j+1].pos_x)&&(pos[j].pos_y>pos[j+1].pos_y)) { temp=pos[j]; pos[j]=pos[j+1]; pos[j+1]=temp; } } } for(i=0;i<n;i++) { printf("(%d,%d) ",pos[i].pos_x,pos[i].pos_y); } cout<<endl; return 0; }

 

A:點排序-poj