解题思路:运用三角思维,b的值相当于竖直方向总长度,c的值相当于水平方向总长度,从竖直方向和水平方向两个角度,两个计算都是一样,然后竖直方向分向上和向下,水平方向分向左和向右,计算都是一样。然后在分情况,一种是没有碰过一次的情况,一种是碰过一次之后(这种再分两种情况讨论,一种是碰撞次数为奇数,一种是为偶数的情况,因为最后是从不同的两端开始计算),然后通过求余的方法来算出最终的碰撞最后一次后走的路程即可。
注意事项:除了整数部分,浮点数要用double型,否组有些数据组的精度会不够。浮点数求余要用fmod()函数。
参考代码:
#include<stdio.h>
#include<math.h>
int main()
{
int l,w,x,y,r,a,v,s;
double b,c,d,f,g,h,k,m,x0,y0;
int i,j;
while(scanf("%d%d%d%d%d%d%d%d",&l,&w,&x,&y,&r,&a,&v,&s)!=EOF)
{
if(l==0)//l=0就结束运行
break;
else
{
d=(acos(-1))*a/180;//角度转弧度制
b=v*s*sin(d);
c=v*s*cos(d);
if(b>=0) //b>=0先向上走
{
if(b<=w-(y+r)) //要是没有碰撞就到了时间的y0
y0=y+b;
else //碰撞后到了时间
{
d=b-w+y+r; //第一次碰撞后剩余路程
f=w-2*r; //一次碰撞到下一次中间路程
i=floor(d/f);
if(i%2==0) //等于0就是从上面开始算;
{
y0=w-r-fmod(d,f);
}
else //不等于0就是从下面开始算
{
y0=r+fmod(d,f);
}
}
}
else //先向下走 (同上)
{
k=fabs(b);
if(k<=y-r)
y0=y-k;
else
{
d=k-y+r;
f=w-2*r;
i=floor(d/f);
if(i%2==0)
{
y0=r+fmod(d,f);
}
else
{
y0=w-r-fmod(d,f);
}
}
}
if(c>=0) //先向右走 (同上)
{
if(c<=l-(x+r))
x0=x+c;
else
{
g=c-l+x+r;
h=l-2*r;
j=floor(g/h);
if(j%2==0)
{
x0=l-r-fmod(g,h);
}
else
{
x0=fmod(g,h)+r;
}
}
}
else //先向左走(同上)
{
m=fabs(c);
if(m<=x-r)
x0=x-m;
else
{
g=m-x+r;
h=l-2*r;
j=floor(g/h);
if(j%2==0)
{
x0=r+fmod(g,h);
}
else
{
x0=l-r-fmod(g,h);
}
}
}
printf("%.2f %.2f\n",x0,y0);
}
}
return 0;
}
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复