求多点的最小外接圆,这代码是看人家大神的,思路貌似是先随机找出三个点然后求出这三个点的外接圆,然后再判断第四个点是否在这个圆内,如果在则跳过,否则就从这四个点中找出三个点构成的外接圆将这四个点都包围在内,以此类推!!!
#include <stdio.h>
#include <math.h>
struct P {
double x, y;
} p[ 10 ];
double max ( double a, double b)
{
return a > b ? a : b;
}
double dis ( double x1, double y1, double x2, double y2)
{
return sqrt (( x1 - x2) * ( x1 - x2) + ( y1 - y2) * ( y1 - y2));
}
double R ( double a, double b, double c)
{
double tmp;
if ( a < b)
{ tmp = b; b = a; a = tmp; }
if ( a < c)
{ tmp = a; a = c; c = tmp; }
if ( a * a > b * b + c * c)
return ( 0.5 * a);
return ( a * b * c / sqrt (( a + b + c) * ( b + c - a) * ( a + c - b) * ( a + b - c)));
}
int main ()
{
int n;
double r, r1, r2, a, b, c;
while ( scanf ( "%d" , & n) == 1 )
{
for ( int i = 0 ; i < n; i++)
scanf ( "%lf%lf" , & p[ i]. x, & p[ i]. y);
r1 = 0 ;
for ( int i = 0 ; i < n; i++)
for ( int j = 0 ; j < n; j++)
{
double tmp = 0.5 * dis ( p[ i]. x, p[ i]. y, p[ j]. x, p[ j]. y);
if ( tmp > r1) r1 = tmp;
}
r = r1;
if ( n > 2 )
{
r2 = 0 ;
for ( int i = 0 ; i < n; i++)
for ( int j = 0 ; j < n; j++)
for ( int k = 0 ; k < n; k++)
{
a = dis ( p[ i]. x, p[ i]. y, p[ j]. x, p[ j]. y);
b = dis ( p[ i]. x, p[ i]. y, p[ k]. x, p[ k]. y);
c = dis ( p[ j]. x, p[ j]. y, p[ k]. x, p[ k]. y);
double tmp = R ( a, b, c);
if ( tmp > r2) r2 = tmp;
}
r = r2;
}
printf ( "%.2lf \n " , r);
}
return 0 ;
}
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=47276