原题链接:台球碰撞
解题思路:
注意事项:
参考代码:
import java.util.Scanner; public class C1075 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { int L = sc.nextInt(), W = sc.nextInt(), x = sc.nextInt(), y = sc.nextInt(), r = sc.nextInt(), a = sc.nextInt(), v = sc.nextInt(), s = sc.nextInt(); if(L == 0 && W == 0 && x == 0 && y == 0 && r == 0 && a == 0 && v == 0 && s == 0){ break; } int dis = v * s; double radians = Math.toRadians(a); //球心在Y轴和X轴移动的总距离 double disY = Math.abs(Math.sin(radians) * dis), disX = Math.abs(Math.cos(radians) * dis); double rsX = r, rsY = 0; //表示球心的落点 //Y轴处理 int maxDisY = W - r; boolean flagUp = (a >= 0 && a <= 180); while(true){ if(flagUp){ //上升 if(y + disY <= maxDisY){ rsY = y + disY; break; }else{ disY = disY - (maxDisY - y); y = maxDisY; flagUp = false; } }else{ //下降 if(disY <= y){ rsY = y - disY; break; }else{ disY = disY - (y - r); y = r; flagUp = true; } } } //X轴处理 int maxDisX = L - r; flagUp = (a <= 90 || a>= 270); while(true){ if(flagUp){ //上升 if(x + disX <= maxDisX){ rsX = x + disX; break; }else{ disX = disX - (maxDisX - x); x = maxDisX; flagUp = false; } }else{ //下降 if(disX <= x){ rsX = x - disX; break; }else{ disX = disX - (x - r); x = r; flagUp = true; } } } System.out.printf("%.2f %.2f\n", rsX, rsY); } sc.close(); } }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复