ZOJ 3414

      练习赛,很基础的计算几何题,考察的是定比分点,哎,当时是思路是清晰的,不过没自信没去敲,队友给过了,今天自己来敲了下,算是过了,比较容易出错的可能是分段的那里,要把分好段后取点时的情况考虑清楚:(该题意思为由多个线段首尾相连组成一条路径,让你把它等分成m+1段)

      1.当所分的等分段在一条线段上挺好办,直接按定比分点算

      2.当所分的等分段在两条线段上怎么办

     以上两点可得出需要记录下每次分段的起始位置,以便利用,还有当前段长度的更新。

     总归来说,是的好好自己敲点代码,开学也不能懈怠,加油!

     

#include<cstdio>

const int maxn = 1000;
const double eps = 1e-8;
struct Point{
    double x;
    double y;
}p[maxn];
double line[maxn];

int dblcmp(double x){   return x<-eps?-1:x>eps; }
double get_dis(Point p1,Point p2){
    return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)); 
}
 
int main(){
      int n,m,kase=1;
      while(scanf("%d %d",&n,&m)!=EOF){
           p[0].x=0,  p[0].y=0;
           for(int i=1;i<=n;i++)scanf("%lf %lf",&p[i].x,&p[i].y);
           double sum=0;
           for(int i=0;i<n;i++){
              double dis=get_dis(p[i],p[i+1]);
              line[i]=dis;
              sum+=dis; 
           } 
           double ave=sum/(m+1);
           int t=0,pos=0;
           double sx=p[0].x,sy=p[0].y;
           double x,y,r;
           double reg=ave;
           printf("Route %d\n",kase++);
           while(t<m){
                if(dblcmp(reg-line[pos])<=0){
                      if(dblcmp(reg-line[pos])==0)r=0;
                      else  r=reg/(line[pos]-reg);  
                      x=(sx+r*p[pos+1].x)/(1+r);
                      y=(sy+r*p[pos+1].y)/(1+r);
                      sx=x; sy=y;
                      printf("CP%d: (%.3lf, %.3lf)\n",t+1,x,y);
                      line[pos]-=reg;
                      reg=ave;
                      t++;            
                }
                if(dblcmp(reg-line[pos])>0){
                      reg-=line[pos];
                      pos++;
                      sx=p[pos].x; 
                      sy=p[pos].y;
                }
           }
      }
      return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值