我的思想与2楼一样,就是把丁俊晖最后的点的对称点找到。如图示,(x1',y1')点是(x1,y1)对于右边墙面的对称点,当有左右两面墙的反射是就计算两面的反射。前后墙同左右墙,图中(x0',y0')就是(x0,y0)对于前后墙的反射点。而(x1'',y1'')是我把丁俊晖运动路线还原成直线后,丁俊晖的位置。现在我们就可以简单地计算图中的s即可。s就是他的位移总量,h=h1+h2*2+h3;L=1000-x0+1000-x1=2000-x1-x2; 假设前后墙的反射点有m个,那么h=h1+h2*m+h3;左右墙有n个,那么L=L0*(n-1)+L0*2-x0-x1=L0*(n+1)-x0-x1;其中h2是房间的宽,L0是房间的长。
我有个方法,这个矩形房间放在在一个坐标系中(实际上题目就是这么描述的),起始点是电脑位置,终点是丁俊晖位置,根据最后一行提供的FBLR信息矩形房间的长宽,可以求出电脑位置以对应的墙面为对称轴的的对称点位置,再拿这个对称位置和下一个FBLR信息求下一个对称点...这样到最后计算最终的对称点位置(电脑)和丁俊晖的位置间距离就是他走过的距离了!实际上就是先把丁俊晖的路线还原成直线在求直线距离,不难的。
把最后输出语句 printf("%.4f\n",d);
改成 printf("%.4lf\n",d);
1、通过(x1,y1) (x0,y0) 知道直线的方程,利用直线方程和墙的位置计算到反射点的距离。
2、将斜率反转根据碰到的强的位置计算反射路线的距离。
3、不断累积2中的距离就可以得到所需的长度了。
4、一碰到墙的序列作为循环结束条件。
5、将循环中的距离+初始的距离就是总的长度(输出结果精确到小数点后 4 位)。