Section 5.2 Electric Fences

/*
ID: niepeng1
PROG: fence3
LANG: C++
*/
/*
 由于在一定范围内肯定越靠近目标点,距离和越小。
 于是枚举所有范围内的点。
 每次枚举的点间距离减为上次的1/10,最后求出最短距离。
 只是最后枚举边界,为什么要增大那么多???
 难道让我们多次后校正吗?
*/
#include<math.h>
#include<iostream>
using namespace std;
const double INF=1e-7;
struct node{
 double lx;
 double ly;
 double rx;
 double ry;
};
node fence[150];
double ansx,ansy,ansdis,tem;
int fencenum;
double mintotal,temtotal;
inline double dis(double x,double y,double x1,double y1)
{
 return sqrt( (x-x1)*(x-x1)+(y-y1)*(y-y1) );
}
double caldis(double x,double y)
{
 int i;
 temtotal=0;
 for(i=0;i<fencenum;i++)
 {
  if(fence[i].rx==fence[i].lx)
  {
   if(y<fence[i].ly)  temtotal+=dis(x,y,fence[i].lx,fence[i].ly);
   else if(y>fence[i].ry)  temtotal+=dis(x,y,fence[i].rx,fence[i].ry);
   else temtotal += fabs(x-fence[i].rx);
  }
  else
  {
   if(x<fence[i].lx)  temtotal+=dis(x,y,fence[i].lx,fence[i].ly);
   else if(x>fence[i].rx) temtotal+=dis(x,y,fence[i].rx,fence[i].ry);
   else temtotal += fabs(y-fence[i].ry);
  }
 }
 return temtotal;
}
int main()
{
 freopen("fence3.in","r",stdin);
 freopen("fence3.out","w",stdout);
 scanf("%d",&fencenum);
 int i;
 for(i=0;i<fencenum;i++)
 {
  scanf("%lf%lf%lf%lf",&fence[i].lx,&fence[i].ly,&fence[i].rx,&fence[i].ry);
  if(fence[i].lx>fence[i].rx){
   tem=fence[i].lx;
   fence[i].lx=fence[i].rx;
   fence[i].rx=tem;
  }
  if(fence[i].ly>fence[i].ry){
   tem=fence[i].ly;
   fence[i].ly=fence[i].ry;
   fence[i].ry=tem;
  }
 }

 double grid=10,area=100;
 double temdis,ix,iy,pointx,pointy;
 ansx=50;ansy=50;
 ansdis=caldis(ansx,ansy);
 for(;area>0.1;area/=10,grid/=10)
 {
  pointx=ansx;pointy=ansy;
  for(ix=pointx-area/2-0.5;ix<=pointx+area/2+0.5;ix+=grid)
   for(iy=pointy-area/2-0.5;iy<=pointy+area/2+0.5;iy+=grid)
   {
/*    if( fabs(ix-55.0)<INF  &&  fabs(iy-55.7)<INF)
     printf("   ");
*/
    temdis=caldis(ix,iy);
    if( temdis < ansdis)
    {
     ansdis=temdis;
     ansx=ix;
     ansy=iy;
    }
   }
 }
 printf("%.1lf %.1lf %.1lf/n",double(int(ansx*10+0.5))/10.0,double(int(ansy*10+0.5))/10.0,ansdis);

 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值