解题思路:运用三角思维,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.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论