写一个程序,实现凸包问题的蛮力算法。
请使用蛮力法而不是其他方法,不然你可能会受到分数的制裁。期待的时间复杂度是O(n^3)
输入格式
输入数据第一行含有一个整数n [1,200],表示点的数量。
接下来n行,每行包括一个整点的坐标(xi,yi) [-1000,1000]。
输出格式
输出共一行,表示这些点的凸包的长度,当相对或者绝对误差在10^-6以内时,你的答案将被判定为正确。
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
|
以文本方式显示
|
1秒 | 153600KB | 0 |
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int main()
{
int n,p[200][2],k,i,j,f1,f2,f3,a,b,c;
double d,total=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d %d",&p[i][0],&p[i][1]);
for(j=0;j<i;j++)
{
if((p[i][0]==p[j][0])&&(p[i][1]==p[j][1]))
{
n--;
i--;
}
}
}
if(n==1) total=0;
else
{
for(k=0;k<n-1;k++)
{
for(i=k+1;i<n;i++)
{
a=p[k][1]-p[i][1]; //ax+by=c a=y2-y1 b=x1-x2 c=x1y2-x2y1
b=p[i][0]-p[k][0];
c=p[i][0]*p[k][1]-p[k][0]*p[i][1];
f1=0;
f2=0;
f3=0;
for(j=0;j<n;j++)
{
if(a*p[j][0]+b*p[j][1]>c) f1++;
if(a*p[j][0]+b*p[j][1]<c) f2++;
if((a*p[j][0]+b*p[j][1]==c)&&(((p[j][0]-p[k][0])*(p[j][0]-p[i][0])>0)||((p[j][1]-p[k][1])*(p[j][1]-p[i][1])>0))) f3++; //排除掉共线的多余点
}
if(((f1==0)||(f2==0))&&(f3==0))
{
d=sqrt(pow((double)(p[k][0]-p[i][0]),2.0)+pow((double)(p[k][1]-p[i][1]),2.0));
total+=d;
//printf("%f,%d,%d\n",d,f1,f2);
//system("pause");
}
}
}
}
printf("%lf\n",total);
}
来源:CSDN
作者:CN_BIT
链接:https://blog.csdn.net/CN_BIT/article/details/104649843