解题思路:运用三角思维,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语言代码)浏览:1394 |
C二级辅导-统计字符 (C语言代码)浏览:577 |
C语言程序设计教程(第三版)课后习题10.4 (C语言代码)浏览:590 |
2^k进制数 (C++代码)使用递归方法浏览:736 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:701 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:583 |
简单的a+b (C语言代码)浏览:720 |
C语言程序设计教程(第三版)课后习题6.1 (C语言代码)浏览:702 |
C语言程序设计教程(第三版)课后习题4.9 (C语言代码)浏览:387 |
【明明的随机数】 (C语言代码)浏览:845 |