思路:从重心开始向周围探测,看喵呜大神的代码过的
#include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
#define eps 1e-6
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
struct circle
{
double x,y,r;
}c[3];
double p2(double x)
{
return x*x;
}
double dis(double x,double y,double xx,double yy)
{
return sqrt(p2(x-xx)+p2(y-yy));
}
double f(double x,double y)
{
double tmp[3];
for(int i=0;i<3;i++)
tmp[i]=dis(x,y,c[i].x,c[i].y)/c[i].r;
double ans=0;
for(int i=0;i<3;i++)
ans+=p2(tmp[i]-tmp[(i+1)%3]);
return ans;
}
int main()
{
double x=0,y=0;
for(int i=0;i<3;i++)
{
scanf("%lf%lf%lf",&c[i].x,&c[i].y,&c[i].r);
x+=c[i].x/3;
y+=c[i].y/3;
}
double step=1;
while(step>eps)
{
double tmp=f(x,y);
int tag=-1;
for(int i=0;i<4;i++)
{
double cnt=f(x+dir[i][0]*step,y+dir[i][1]*step);
if(cnt<tmp)
{
tmp=cnt;
tag=i;
}
}
if(tag==-1)
step/=2;
else
{
x=x+dir[tag][0]*step;
y=y+dir[tag][1]*step;
}
}
if(f(x,y)<eps)
printf("%.5lf %.5lf\n",x,y);
return 0;
}