C语言练习题——【大学】撞球+

一天,丁俊晖编一整天的程序,突然觉得累了,于是便决定在房间内四处走走。他的房间是矩形的,他从电脑开始随便选了一个角度开始行走。由于职业习 惯,丁俊晖走路始终是直线,而且碰到墙以后会反弹,入射角度与出射角度完全相同。丁俊晖会一直行走,直到灵感再次迸发。假设他的行走速度是匀速的,现在, 丁俊晖的母亲想知道他一共休息了多长时间以便提醒他继续工作。

丁俊晖想考考他的母亲,于是他记录了自己碰到墙壁的序列并且告诉了她,你有没有办法能够帮助她计算出小丁所走的路程?

//这题目给我整笑了

输入

输入包括多个测试用例,每个测试用例如下:
第一行包含两个数字 w, l(0<w, l<=1000),分别代表房间的宽度和长度;
第二行包括两个数字 x0, y0,代表电脑的位置坐标 (x0, y0);
第三行包含两个数字 x1, y1,代表丁俊晖的位置坐标 (x1, y1);
最后一行是一个包含'F', 'B', 'L', 'R'四种字符的字符串,分别代表墙在前面、后面、左边或是右边,字符串的长度小于等于 1000;
我们约定,左上角的坐标为0,0,所有的坐标都是浮点型数字。

输出

一个浮点型数字,代表总路程,结果精确到小数点后 4 位。

测试输入期待的输出时间限制内存限制额外进程
测试用例 1以文本方式显示
  1. 10 20↵
  2. 9 11↵
  3. 1 9↵
  4. FLRLRB↵
以文本方式显示
  1. 63.7809↵
1秒64M0
测试用例 2以文本方式显示
  1. 11 22↵
  2. 8 12↵
  3. 2 10↵
  4. FLRLRB↵
以文本方式显示
  1. 67.9412↵
1秒64M0
测试用例 3以文本方式显示
  1. 7 8↵
  2. 2 4↵
  3. 2 5↵
  4. R↵
以文本方式显示
  1. 10.0499↵
1秒64M0
测试用例 7以文本方式显示
  1. 43 87↵
  2. 12 15↵
  3. 35 37↵
  4. FRLRLRLB↵
以文本方式显示
  1. 319.4761↵
1秒64M0
测试用例 8以文本方式显示
  1. 3 3↵
  2. 2 2↵
  3. 2 3↵
  4. FLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBRFLBR↵
以文本方式显示
  1. 2120.6134↵
1秒64M0

 利用镜像原理,对其一坐标进行变换,即可很快算出结果,代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int main(){
	int l,w;
	scanf("%d %d",&w,&l);
	double x0,y0,x1,y1;
	scanf("%lf %lf",&x0,&y0);
	scanf("%lf %lf",&x1,&y1);
	getchar();
	char a[1000];
	char ch;
	do{
		ch = getchar();
		switch (ch){
			case 'F':y0*=-1;break;
			case 'B':y0+=(l-y0)*2;break;
			case 'L':x0*=-1;break;
			case 'R':x0+=(w-x0)*2;break;
			default:
				break;
		}
	}while(ch!='\n');
	printf("%.4lf\n",sqrt(pow(x0-x1,2)+pow(y0-y1,2)));
	return 0;
}

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值