ZOJ-3414-Trail Walk_计算几何

来源:互联网 发布:郭德纲 人品 知乎 编辑:程序博客网 时间:2024/05/19 03:22

我打代码这么狗还这么懒,以后怎么办。


题意:

给n个点的坐标(整数),以坐标系原点为起点,依次连接各个点,给出正整数m,要求添加m个CP点(check point),把折线按长度平均分开(把起点考虑为第0个和第m+1个CP点)。


Input

There are multiple test cases. The first line of each case contains two integer nm(1 <= nm <= 1000). Then n pairs of integer followed, giving the coordinate of pi.

Output

The first line of each case, output "Route case_number", Then m lines followed, the ith line contains "CPcase_num: (xiyi)" where (xiyi) represent the coordinate of the CPi. Always keep three number after the decimal point.

Sample Input

3 31 12 33 5

Sample Output

Route 1CP1: (1.026, 1.051)CP2: (1.684, 2.368)CP3: (2.342, 3.684)


计算几何里应该不难的题吧,但是由于我计算几何就是狗,而且有点新感悟就写一下。

大体过程只要按正常想法就能模拟出来,关键是公式,计算几何不要直接使用斜率的数值,但是可以通过把k写成(y1-y2)/(x1-x2)的形式表达出来,然后推出最后的式子以后再代数,这样就不会有使用斜率数值的误差了。


代码如下

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cmath>using namespace std;#define mxn 1010int n,m;double len;bool dcmp(double a,double b){return fabs(a-b)<0.001;}struct point{double x,y;point(double _x,double _y){x=_x,y=_y;}point(){};}p[mxn];struct ret{int p_id;double usd;ret(int a,double b){p_id=a,usd=b;}};double dist(point a,point b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}double deltaX(int in,double l){return l*(p[in+1].x-p[in].x)/sqrt((p[in+1].y-p[in].y)*(p[in+1].y-p[in].y)+(p[in+1].x-p[in].x)*(p[in+1].x-p[in].x));}double deltaY(int in,double l){return l*(p[in+1].y-p[in].y)/sqrt((p[in+1].y-p[in].y)*(p[in+1].y-p[in].y)+(p[in+1].x-p[in].x)*(p[in+1].x-p[in].x));}ret find(ret in,double tgt,int cp_id){double tem=dist(p[in.p_id],p[in.p_id+1]);if(tem-in.usd<=tgt||dcmp(tem-in.usd,tgt))return find(ret(in.p_id+1,0.0),tgt-tem+in.usd,cp_id);printf("CP%d: ",cp_id);double delta_x=deltaX(in.p_id,tgt+in.usd);double delta_y=deltaY(in.p_id,tgt+in.usd);printf("(%.3lf, %.3lf)\n",p[in.p_id].x+delta_x,p[in.p_id].y+delta_y);return ret(in.p_id,in.usd+tgt);}int main(){int cs=1;while(scanf("%d%d",&n,&m)!=EOF){double sum=0;p[0]=point(0.0,0.0);for(int i=1;i<=n;++i){scanf("%lf%lf",&p[i].x,&p[i].y);sum+=dist(p[i-1],p[i]);}len=sum/(m+1);ret start(0,0.0);printf("Route %d\n",cs++);for(int i=0;i<m;++i){ret tem=find(start,len,i+1);start=tem;}}return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 房东要收回店面怎么办 天猫字迹模糊怎么办 淘宝类目不叫上架怎么办 淘宝直播有延迟怎么办 淘宝直播间中奖怎么办 微信扫码付款后卖家不发货怎么办 淘宝打骚扰电话怎么办 淘宝卖家打骚扰电话怎么办 被商家打了怎么办 保底消费入坑怎么办 留党查看到期怎么办 遭遇淘宝控价怎么办 淘宝店没有了怎么办 淘宝店铺运费险不出单怎么办 闲鱼定金被骗怎么办 肯德基团购过期怎么办 word不可以修改怎么办 店铺预售不发货怎么办 埋件设置不符合怎么办 闲鱼付了款卖家不发货怎么办 微信里付了款卖家不发货怎么办 运动鞋穿臭了怎么办 小车陷泥土了怎么办 孩子有心事不说怎么办 网状运动鞋乱了怎么办 运动鞋布面坏了怎么办 运动鞋面破了怎么办 脚磨烂了怎么办小妙招 网眼运动鞋破了怎么办 运动鞋后面烂了怎么办 运动鞋面坏了怎么办 磨档磨的特别疼怎么办 夏天高跟鞋里面脏了怎么办 走路鞋底有声音怎么办 鞋后跟海绵塌了怎么办 鞋后跟凹进去了怎么办 穿高跟鞋臭脚怎么办 运动鞋磨后脚跟怎么办 鞋两边磨脚踝怎么办 新鞋子磨脚踝怎么办 耐克鞋两边挤脚怎么办