日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NYOJ - 78 圈水池 【凸包】

發(fā)布時(shí)間:2023/12/20 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NYOJ - 78 圈水池 【凸包】 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

圈水池

時(shí)間限制:3000 ms? |? 內(nèi)存限制:65535 KB

難度:4

描述
有一個(gè)牧場(chǎng),牧場(chǎng)上有很多個(gè)供水裝置,現(xiàn)在牧場(chǎng)的主人想要用籬笆把這些供水裝置圈起來,以防止不是自己的牲畜來喝水,各個(gè)水池都標(biāo)有各自的坐標(biāo),現(xiàn)在要你寫一個(gè)程序利用最短的籬笆將這些供水裝置圈起來!(籬笆足夠多,并且長(zhǎng)度可變) 輸入
第一行輸入的是N,代表用N組測(cè)試數(shù)據(jù)(1<=N<=10)
第二行輸入的是m,代表本組測(cè)試數(shù)據(jù)共有m個(gè)供水裝置(3<=m<=100)
接下來m行代表的是各個(gè)供水裝置的橫縱坐標(biāo)
輸出
輸出各個(gè)籬笆經(jīng)過各個(gè)供水裝置的坐標(biāo)點(diǎn),并且按照x軸坐標(biāo)值從小到大輸出,如果x軸坐標(biāo)值相同,再安照y軸坐標(biāo)值從小到大輸出
樣例輸入
1
4

0 0

1 1

2 3

3 0

樣例輸出
0 02 33 0

#include <iostream>

#include <cmath>

#include <algorithm>

using namespace std;

/*

PointSet[]: 輸入的點(diǎn)集

ch[]:輸出的凸包的點(diǎn)集,按照逆序輸出

n:PointSet中點(diǎn)的數(shù)目

len:輸出的凸包上的點(diǎn)的個(gè)數(shù)

*/

struct Point{

float x,y;

};

//小于說明向量p0p1的極角大于p0p2的極角

float multiply(Point p1,Point p2,Point p0)

{

return ((p1.x-p0.x)*(p2.y-p0.y) -(p2.x-p0.x)*(p1.y-p0.y));

}

float dis(Point p1,Point p2)

{

return sqrt((p1.x-p2.x)*(p1.x -p2.x) + (p1.y-p2.y)*(p1.y-p2.y));

}

void Graham_scan(Point PointSet[],Point ch[],int n,int &len)

{

int i,j,k=0,top = 2;

Point tmp;

for (i=1;i<n;i++)

if ((PointSet[i].y<PointSet[k].y ||((PointSet[i].y==PointSet[k].y)) &&(PointSet[i].x <PointSet[k].x)))

k=i;

tmp =PointSet[0];

PointSet[0]=PointSet[k];

PointSet[k]=tmp;

//按極角大小排序

for (i=1;i<n-1;i++)

{

k=i;

for (j=i+1;j<n;j++)

{

if ((multiply(PointSet[j],PointSet[k],PointSet[0])>0)

||((multiply(PointSet[j],PointSet[k],PointSet[0])==0)

&& (dis(PointSet[0],PointSet[j]) < dis(PointSet[0],PointSet[k]))))

{

tmp = PointSet[j];

PointSet[j] = PointSet[k];

PointSet[k] = tmp;

}

}

}

ch[0] = PointSet[0];

ch[1] = PointSet[1];

ch[2] = PointSet[2];

for (i=3;i<n;i++)

{

while (multiply(PointSet[i],ch[top],ch[top-1])>0)

top--;

ch[++top] = PointSet[i];

}

len = top+1;

}

const int maxN = 1000;

Point PointSet[maxN];

Point ch[maxN];

int n;

int len;

int cmp(const void *a,const void *b)

{

Point pa = *(Point *)a;

Point pb = *(Point *)b;

if (pa.x>pb.x)

return 1;

else if((pa.x ==pb.x) &&pa.y>pb.y)

return 1;

else return -1;

}

void solve()

{

int n,i;

cin>>n;

for (i=0;i<n;i++)

cin>>PointSet[i].x>>PointSet[i].y;

Graham_scan(PointSet,ch,n,len);

qsort(ch,len,sizeof(ch[0]),cmp);

for (i=0;i<len;i++)

cout<<ch[i].x<<" "<<ch[i].y<<endl;

}

int main()

{

int n;

cin>>n;

while (n--)

{

solve();

}

}

轉(zhuǎn)載于:https://www.cnblogs.com/zhijzan/archive/2012/04/12/2444963.html

總結(jié)

以上是生活随笔為你收集整理的NYOJ - 78 圈水池 【凸包】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。