Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
kick,谁说挂的……一交就ac了……In Reply To:Re:第二个数据就挂了,找了一份凸包和一份求多边形面积,结果居然也挂了 Posted by:shhu at 2007-08-24 02:23:44 > 第二个数据是 > 10 > -521 -296 > -575 -419 > -516 -864 > -114 -106 > 187 295 > -404 12 > 840 -852 > 948 -405 > 247 704 > 1 170 > > 28638 > > #include<cstdio> > #include<algorithm> > using namespace std; > #define MAX 10000 > typedef struct > { > int x,y; > }POINT; > POINT tree[MAX]; > int n,sel_num; > int doudis(POINT end,POINT from) > { > return (end.x-from.x)*(end.x-from.x)+(end.y-from.y)*(end.y-from.y); > } > int crossmul(POINT fir,POINT sec,POINT mid) > { > return (fir.x-mid.x)*(sec.y-mid.y)-(fir.y-mid.y)*(sec.x-mid.x); > } > bool cmp(const POINT fir,const POINT sec) > { > if(crossmul(fir,sec,tree[0])>0) > return true; > return crossmul(fir,sec,tree[0])==0&&doudis(fir,tree[0])<doudis(sec,tree[0]); > } > int mul(POINT fir,POINT sec,POINT thi) > { > return (fir.x-sec.x)*(sec.y-thi.y)-(fir.y-sec.y)*(sec.x-thi.x); > } > void Graham() > { > int i,j; > int pt=0; > for(i=1;i<n;i++) > if(tree[i].y<tree[pt].y||(tree[i].y==tree[pt].y&&tree[i].x<tree[pt].x)) > pt=i; > swap(tree[0],tree[pt]); > sort(tree+1,tree+n,cmp); > sel_num=3; > for(i=3;i<n;i++) > { > while(mul(tree[i],tree[sel_num-1],tree[sel_num-2])>=0) > sel_num--; > tree[sel_num++]=tree[i]; > } > } > //int area2() > //{ > // int i,s; > // s=tree[0].y*(tree[sel_num-1].x-tree[1].x); > // for(i=1;i<sel_num;i++) > // s+=tree[i].y*(tree[i-1].x-tree[(i+1)%sel_num].x); > // return s>0?s:-s; > //} > //int area2() > //{ > // int i,s; > // s=tree[0].x*tree[sel_num-1].y-tree[0].y*tree[sel_num-1].x; > // for(i=1;i<sel_num;i++) > // s+=tree[i-1].x*tree[i].y-tree[i-1].y*tree[i].x; > // return s>0?s:-s; > //} > int area2() > { > int i,s; > s=0; > tree[sel_num]=tree[0]; > for(i=0;i<sel_num;i++) > { > s+=tree[i].x*tree[i+1].y-tree[i].y*tree[i+1].x; > // printf("%d\n",s); > } > return s>0?s:-s; > } > int main() > { > int i; > scanf("%d",&n); > for(i=0;i<n;i++) > scanf("%d%d",&tree[i].x,&tree[i].y); > Graham(); > // printf("%d\n",sel_num); > // for(i=0;i<sel_num;i++) > // printf("%d %d\n",tree[i].x,tree[i].y); > printf("%d\n",area2()/100); > // while(1); > return 0; > } > > > > > > > > > > > > > > 网上的东西 > #include<iostream.h> > #include<math.h> > > #define MAX 1000 > > int main() > { > int n,i; > double point[MAX][2],area; > while(cin>>n&&n>=3){ > for(i=0;i<n;i++) cin>>point[i][0]>>point[i][1]; //沿着多边形的边逐个输入各顶点坐标; > > area=0; > for(i=0;i<n;i++){ > int next=(i+1)>=n?0:(i+1); > area+=(point[next][0]-point[i][0])*(point[next][1]+point[i][1])/2; //使用向量法求解!!! > } > area=fabs(area); //注意!!! > cout<<"area="<<area/50<<endl; > } > return 0; > } > /********************************************** > 寻找凸包的graham 扫描法 > PointSet为输入的点集; > ch为输出的凸包上的点集,按照逆时针方向排列; > n为PointSet中的点的数目 > len为输出的凸包上的点的个数 > **********************************************/ > #include<stdio.h> > #include<math.h> > const double INF=1E200; > const double EP=1E-10; > #define PI acos(-1) > /*基本几何数据结构*/ > > //点(x,y) > struct POINT > { > double x; > double y; > }; > > > // 返回两点之间欧氏距离 > double distance(POINT p1, POINT p2) > { > return sqrt( (p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y)); > } > /****************************************************************************** > r=multiply(sp,ep,op),得到(sp-op)*(ep-op)的叉积 > r>0:ep在矢量opsp的逆时针方向; > r=0:opspep三点共线; > r<0:ep在矢量opsp的顺时针方向 > *******************************************************************************/ > //叉积就是2向量形成的平行四边形的面积 > double multiply(POINT sp,POINT ep,POINT op) > { > return((sp.x-op.x)*(ep.y-op.y)-(ep.x-op.x)*(sp.y-op.y)); > } > > int partition(POINT a[],int p,int r) > { > int i=p,j=r+1,k; > double ang,dis; > POINT R,S; > k=(p+r)/2;//防止快排退化 > R=a[p]; > a[p]=a[k]; > a[k]=R; > R=a[p]; > dis=distance(R,a[0]); > while(1) > { > while(1) > { > ++i; > if(i>r) > { > i=r; > break; > } > ang=multiply(R,a[i],a[0]); > if(ang>0) > break; > else if(ang==0) > { > if(distance(a[i],a[0])>dis) > break; > } > } > while(1) > { > --j; > if(j<p) > { > j=p; > break; > } > ang=multiply(R,a[j],a[0]); > if(ang<0) > break; > else if(ang==0) > { > if(distance(a[j],a[0])<dis) > break; > } > } > if(i>=j)break; > S=a[i]; > a[i]=a[j]; > a[j]=S; > } > a[p]=a[j]; > a[j]=R; > return j; > } > > void anglesort(POINT a[],int p,int r) > { > if(p<r) > { > int q=partition(a,p,r); > anglesort(a,p,q-1); > anglesort(a,q+1,r); > } > } > > void Graham_scan(POINT PointSet[],POINT ch[],int n,int &len) > { > int i,k=0,top=2; > POINT tmp; > // 选取PointSet中y坐标最小的点PointSet[k],如果这样的点有多个,则取最左边的一个 > 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; // 现在PointSet中y坐标最小的点在PointSet[0] > /* 对顶点按照相对PointSet[0]的极角从小到大进行排序,极角相同 > 的按照距离PointSet[0]从近到远进行排序 */ > anglesort(PointSet,1,n-1); > > 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; > } > > #define M 100000 > POINT a[M],b[M]; > int main() > { > > int n,i,l; > scanf("%d",&n); > for(i=0;i<n;i++) > scanf("%lf %lf",&a[i].x,&a[i].y); > Graham_scan(a,b,n,l); > for(i=0;i<l;i++) > printf("%lf %lf\n",b[i].x,b[i].y); > while(1); > return 0; > } > > > Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator