一天,丁俊晖编一整天的程序,突然觉得累了,于是便决定在房间内四处走走。他的房间是矩形的,他从电脑开始随便选了一个角度开始行走。由于职业习 惯,丁俊晖走路始终是直线,而且碰到墙以后会反弹,入射角度与出射角度完全相同。丁俊晖会一直行走,直到灵感再次迸发。假设他的行走速度是匀速的,现在, 丁俊晖的母亲想知道他一共休息了多长时间以便提醒他继续工作。
丁俊晖想考考他的母亲,于是他记录了自己碰到墙壁的序列并且告诉了她,你有没有办法能够帮助她计算出小丁所走的路程?
输入
输入包括多个测试用例,每个测试用例如下:
第一行包含两个数字 w, l(0<w, l<=1000),分别代表房间的宽度和长度;
第二行包括两个数字 x0, y0,代表电脑的位置坐标 (x0, y0);
第三行包含两个数字 x1, y1,代表丁俊晖的位置坐标 (x1, y1);
最后一行是一个包含'F', 'B', 'L', 'R'四种字符的字符串,分别代表墙在前面、后面、左边或是右边,字符串的长度小于等于 1000;
我们约定,左上角的坐标为0,0,所有的坐标都是浮点型数字。
输出
一个浮点型数字,代表总路程,结果精确到小数点后 4 位。
#include <stdio.h>
#include <math.h>
void main()
{
int i,b;
double w,l,x0,y0,x1,y1,d;
char a[1000];
scanf("%lf%lf",&w,&l);
scanf("%lf%lf",&x0,&y0);
scanf("%lf%lf\n",&x1,&y1);
for(i=0;i<1000;i++)
{
scanf("%c",&a[i]);
if(a[i]=='\n')
{
b=i;
break;
}
}
for(i=0;i<b;i++)
{
if(a[i]=='R')
{
x0=2*w-x0;
}
if(a[i]=='L')
{&nb
我的思想与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信息是你给出来的,所以前后左右你应该能确定,要是你不清楚的话那我就有疑问了,根据你给出的程序和第一个测试用例得到下图:
不管你从什么角度出发到达F面后,也不会接着LRLR在左右面反射三四次吧?!跟你确认一下,你给成的FBLR信息是你随便写的吗?还是一个合理的路线呢?
是按我程序的那个FLBR来的,最后一个为什么不对呢