NYOJ - 78 圈水池 【凸包】
圈水池
時(shí)間限制:3000 ms? |? 內(nèi)存限制:65535 KB
難度:4
描述第二行輸入的是m,代表本組測(cè)試數(shù)據(jù)共有m個(gè)供水裝置(3<=m<=100)
接下來(lái)m行代表的是各個(gè)供水裝置的橫縱坐標(biāo)
0 0
1 1
2 3
3 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;
};
//小于說(shuō)明向量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èn)題。
- 上一篇: 开始学习鸟哥的Linux私房菜-基础篇(
- 下一篇: hamcrest的jar包_重新设计Ha