这是我的代码,思路是走一步,就做一次边界碰撞检测,如果碰到边界了就改变角度 a 继续走。题示的测试用例能算出正确结果,提交后的第一个测试用例也能通过,但第二个就通不过了,四条边界正向,负向的反弹考虑了,还有如果边界围成的是正方形,主对角线和次对角线上的反弹也考虑了,不知道还有哪种情况没考虑到,实在是不会了。如果有大佬知道第二个测试用例是啥,可不可以截图发出来,阿里嘎多。

  1. #include <stdio.h>
  2. #include <math.h>
  3. int main(void)
  4. {
  5. double L,W,x,y,R,a,v;
  6. int s,temp;
  7. while(~scanf("%lf %lf %lf %lf %lf %lf %lf %d",&L,&W,&x,&y,&R,&a,&v,&s))
  8. {
  9. if(L==0)
  10. break;
  11. for(temp=1;temp<=s;++temp)
  12. {
  13. x=x+v*cos(a*acos(-1)/180);
  14. y=y+v*sin(a*acos(-1)/180);
  15. if(y+R>=W)
  16. {
  17. if(a>=0 && a<=90)
  18. a=360-a;
  19. if(a>90 && a<=180)
  20. a=360-a;
  21. }
  22. if(y-R<=0)
  23. {
  24. if(a>=180 && a<=270)
  25. a=360-a;
  26. if(a>270 && a<=360)
  27. a=360-a;
  28. }
  29. if(x+R>=L)
  30. {
  31. if(a>=0 && a<=90)
  32. a=180-a;
  33. if(a>=270 && a<=360)
  34. a=180+360-a;
  35. }
  36. if(x-R<=0)
  37. {
  38. if(a>=90 && a<=180)
  39. a=180-a;
  40. if(a>180 && a<=270)
  41. a=180+360-a;
  42. }
  43. }
  44. printf("%.2lf %.2lf\n",x,y);
  45. }
  46. return 0;
  47. }
点赞(0)
 

0 分

0 人评分

 

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论