题目链接:
典型凸包
1.当只有一个点时 输出时0.00
2.当只有两个点时 输出时两个点的距离
3.当n>2 且共线时,输出需要*2,(这个是题目的奇怪之处,当只有2点时不用)
1 #include2 #include 3 #include 4 #define max(a,b) (a>b?b:a) 5 6 struct node{ 7 double x,y; 8 int i; 9 }; 10 11 struct node stack[101]; 12 long int point1,point2; 13 double x[101]; 14 double y[101]; 15 16 void instack(int x,int y,int i);//入栈 17 void outstack();//出栈 18 19 int main() 20 { 21 long int n,i,j,t1; 22 double sum,a,b,x1,x2,y1,y2,t,p; 23 //freopen("1.txt","r",stdin); 24 25 while(scanf("%ld",&n)!=EOF&&n) 26 { 27 28 t1=0;//代表着y0 29 for(i=0;i x[t1]&&y[i]==y[t1]))//寻找Y最小的点,若同,则寻X最大 33 t1=i; 34 } 35 36 if(n==1) { printf("0.00\n"); continue;}//当只有一个点时 37 if(n==2) //当只有两个点时 38 { 39 a=(x[1]-x[0])*(x[1]-x[0]); 40 b=(y[1]-y[0])*(y[1]-y[0]); 41 printf("%.2lf\n",sqrt(a+b)); 42 continue; 43 } 44 45 //将y0点放在x[0],y[0]; 46 p=x[t1]; 47 x[t1]=x[0]; 48 x[0]=p; 49 p=y[t1]; 50 y[t1]=y[0]; 51 y[0]=p; 52 53 //将x[0],y[0]作为标准 54 for(i=1;i =0) 93 { 94 outstack(); 95 continue; 96 } 97 else 98 { 99 instack(x[i],y[i],i);100 }101 i++;102 }103 104 //计算路径长度105 sum=0;106 for(i=1;i<=point2;i++)107 {108 109 a=(stack[i].x-stack[i-1].x)*(stack[i].x-stack[i-1].x);110 b=(stack[i].y-stack[i-1].y)*(stack[i].y-stack[i-1].y);111 sum+=sqrt(a+b);112 }113 114 //输出115 if(point2==1) printf("%.2lf\n",sum*2);//当n>2 且全部共线116 else//正常情况的输出117 {118 a=stack[point2].x*stack[point2].x;119 b=stack[point2].y*stack[point2].y;120 sum+=sqrt(a+b);121 printf("%.2lf\n",sum);122 }123 124 }125 return 0;126 }127 128 //***********下面为子函数***************129 void instack(int x,int y,int i)//入栈130 {131 point1++;132 point2++;133 stack[point2].x=x;134 stack[point2].y=y;135 stack[point2].i=i;136 }137 138 void outstack()//出栈139 {140 point1--;141 point2--;142 }