显示代码纯文本
#include <fstream>
#include <algorithm>
#include <cmath>
#include <iomanip>
#define N 1110
using namespace std;
typedef long double ld;
ifstream cin("runaway.in");
ofstream cout("runaway.out");
int n;
ld ansx,ansy,r,X[120],Y[120],R[120],INF=999999999;
ld XO,YO;
class point
{
public:
ld x,y;
void make(ld a,ld b)
{
x=a;
y=b;
}
void print()
{
cout<<x<<' '<<y<<endl;
}
}P[N],dir[9];
ld operator *(point a,point b)
{
ld solo;
solo=a.x*b.x+a.y*b.y;
return solo;
}
void print(ld x)
{
cout <<setprecision(1) <<std::fixed <<x;
}
point operator -(point a,point b)
{
point c;
c.x=a.x-b.x;
c.y=a.y-b.y;
return c;
}
point operator +(point a,point b)
{
point c;
c.x=a.x+b.x;
c.y=a.y+b.y;
return c;
}
point operator *(point a,ld b)
{
point c;
c.x=a.x*b;
c.y=a.y*b;
return c;
}
ld len(point x){return sqrt(x*x);}
ld dis(point x)
{
int i;
point y;
ld sum=INF,temp=0;
for(i=1;i<=n;i++)
{
y=x-P[i];
temp=len(y);
//cout<<temp<<endl;
if(temp<sum)sum=temp;
}
//cout<<sum<<endl;
return sum;
}
void init()
{
dir[1].make(0,1);
dir[2].make(1,0);
dir[3].make(0,-1);
dir[4].make(-1,0);
dir[5].make(1,-1);
dir[6].make(-1,1);
dir[7].make(1,1);
dir[8].make(-1,-1);
srand(time(NULL));
}
void ansout()
{
cout<<"The safest point is (";
print(ansx);
cout<<',';
print(ansy);
cout<<").";
//print(r);
cout<<endl;
}
bool law(point O)
{
if(O.x>=0&&O.x<=XO&&O.y>=0&&O.y<=YO)return 1;
return 0;
}
void work(point O)
{
ld step,ha,temp,base,basex,basey;
point U,V,T;
int i,k;
U=T=O;
r=0;
base=6.5;
for(k=1;k<=100;k++)
{
r=0;
R[k]=0;
U=O;
for(step=100000;step>=0.0001;step/=base)
{
U=T;
//out<<step<<endl;
for(i=1;i<=8;i++)
{
V=U+dir[i]*step;
if(!law(V))continue;
temp=dis(V);
if(temp>R[k])
{
X[k]=V.x;
Y[k]=V.y;
R[k]=temp;
T=V;
}
}
}
base-=0.05;
}
r=0;
for(k=1;k<=100;k++)
{
if(R[k]>r)
{
ansx=X[k];
ansy=Y[k];
r=R[k];
}
}
//ansout();
/*for(k=1;k<=1;k++)
{
U.make(ansx,ansy);
for(step=-5;step<=5;step+=0.1)
{
for(ha=-5;ha<=5;ha+=0.1)
{
V.x=U.x+step;
V.y=U.y+ha;
temp=dis(V);
if(r>temp)
{
ansx=V.x;
ansy=V.y;
r=temp;
}
}
}
U.make(ansx,ansy);
for(step=-0.5;step<=0.5;step+=0.01)
{
for(ha=-0.5;ha<=0.5;ha+=0.01)
{
V.x=U.x+step;
V.y=U.y+ha;
temp=dis(V);
if(r>temp)
{
ansx=V.x;
ansy=V.y;
r=temp;
}
}
}
U.make(ansx,ansy);
for(step=-0.05;step<=0.05;step+=0.001)
{
for(ha=-0.05;ha<=0.05;ha+=0.001)
{
V.x=U.x+step;
V.y=U.y+ha;
temp=dis(V);
if(r>temp)
{
ansx=V.x;
ansy=V.y;
r=temp;
}
}
}
}*/
}
int main()
{
int T,i;
point Q;
init();
T=1;
while(T--)
{
cin>>XO>>YO>>n;
for(i=1;i<=n;i++)cin>>P[i].x>>P[i].y;
work(P[1]);
ansout();
}
return 0;
}