POJ 3702 距離排序

做完作業去百練上提交這道題目,發現去年的這幾天的提交記錄,WA了無數條也沒有過 = = 也不是很懂爲什麼內排序的題目還會把這道題扒拉出來

思路很簡單,把所有的點記錄下來然後把每兩個點的距離分別求出來然後和兩個點的座標一起存起來,最後進行排序

排序用qsort應該是不行的,快排是不穩定的算法,這道題對算法的穩定性有要求,所以直接bubble排序。

另外一個注意點是求距離的順序,我用的是先求(1,2)(1,3)….(1,n)
再求(2,3)(2,4)..(2,n)
….(n-1,n)
這樣順序就沒問題了

#include<iostream>
#include<iomanip>
#include<math.h>
#include<algorithm>
using namespace std;

#define maxp 12

struct points{
    int x,y,z;
};

typedef struct{
    points p1,p2;
    double val;
}Dis_t;

bool operator <(Dis_t a, Dis_t b){
    return a.val < b.val;
}

ostream & operator<<(ostream &output,Dis_t src){
    //(0,0,0)-(1,1,1)=1.73
    cout<<"("<<src.p1.x<<","<<src.p1.y<<","<<src.p1.z<<")-(";
    cout<<src.p2.x<<","<<src.p2.y<<","<<src.p2.z<<")=";
    cout<<fixed<<setprecision(2)<<src.val;
}

points point[maxp]={0};
Dis_t dis[maxp*maxp]={0};
int n;
int discount = 0;

double calcu(int i,int j){
    double dis0;
    double dx = point[i].x - point[j].x;
    double dy = point[i].y - point[j].y;
    double dz = point[i].z - point[j].z;
    dis0 = sqrt(dx*dx+dy*dy+dz*dz);
    //cout<<dis0<<endl;
    return dis0;
}

int main(){
    cin>>n;
    for(int i=0;i<n;++i){
        cin>>point[i].x>>point[i].y>>point[i].z;
    }

    for(int i=0;i<n-1;++i){
        for(int j=i+1;j<n;++j){
            Dis_t tmp;
            tmp.p1 = point[i];
            tmp.p2 = point[j];
            tmp.val = calcu(i,j);
            dis[discount++] = tmp;
        }
    }

    //sort(dis,dis+discount);
    for(int i=0;i<discount-1;++i){
        for(int j =0;j<discount-i-1;++j){
            if(dis[j]<dis[j+1]){
                Dis_t t = dis[j];
                dis[j] = dis[j+1];
                dis[j+1] = t;
            }
        }
    }


    for(int i=0;i<discount;++i){
        cout<<dis[i]<<endl;
    }
    //system("pause");
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章