import java.io.*; public class Main { static BufferedReader bf=new BufferedReader(new InputStreamReader(System.in)); static PrintWriter pw=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out))); public static void main(String[] args) throws IOException { for(;;){ //获得变量 String[] temp=bf.readLine().split(" "); int L=Integer.parseInt(temp[0]); int W=Integer.parseInt(temp[1]); int x=Integer.parseInt(temp[2]); int y=Integer.parseInt(temp[3]); int R=Integer.parseInt(temp[4]); int a=Integer.parseInt(temp[5]); int v=Integer.parseInt(temp[6]); int s=Integer.parseInt(temp[7]); if(check(L,W,x,y,R,a,v,s)) { pw.flush(); break; } //标准化坐标 L-=2*R; W-=2*R; x-=R; y-=R; //将a转换成PI double tempa=Math.toRadians(a); //计算相对原点移动坐标 double Sx=Math.abs(s*v*Math.cos(tempa)+x); double Sy=Math.abs(s*v*Math.sin(tempa)+y); //减去循环 Sx%=2*L; Sy%=2*W; //如果Sx,Sy在L之内,说明往正方向移动,如果为L到2L,则为反向移动 if(Sx>L&&SxW&&Sy<2*W) Sy=2*W-Sy; //转化成原坐标输出 pw.printf("%.2f %.2f\n",Sx+R,Sy+R); } } public static boolean check(int L,int W,int x,int y,int R,int a,int v,int s) { if(L==W&&W==x&&x==y&&y==R&&R==a&&a==v&&v==s) { return true; }else { return false; } } }
解题思路:
F1:如果每次碰撞,走过的路径都要减去2R,太麻烦了,所以标准化坐标,将球相对球桌的运动改变成质点的运动
F2:与其分析二维平面的运动,不如分解成X,Y两个方向的一维运动,(注意,二维分析在竞赛中基本都要分解成一维),分析球在平面的运动,在每个循环中,走过的路径相对原点其实是相同的,所以这里可以计算出,Sx和Sy两个方向的位置,此处应加上x和y,因为是相对原点的距离。
F3:减去循环,整除2L和2W,拿x而言,如果在L和2L之间,则说明,开始是往X轴反方向运动的,这里可以在第二象限做一个第一象限的镜像,所以此处的距离为2L-Sy,Y轴相同
F4:得到相对距离后,在每个加上R,恢复原有坐标,输出,得到答案
注意事项:
这里的plush()要在break之前,所以要在if判段为true之后,在循环体内flush()
参考代码:
0.0分
3 人评分
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:1047 |
C语言程序设计教程(第三版)课后习题9.4 (C语言代码)浏览:760 |
C语言程序设计教程(第三版)课后习题12.6 (C语言代码)浏览:817 |
简单的a+b (C语言代码)浏览:528 |
C语言程序设计教程(第三版)课后习题11.8 (C语言代码)浏览:640 |
奖学金 (C++代码)浏览:2057 |
C语言训练-求s=a+aa+aaa+aaaa+aa...a的值 (C语言代码)浏览:636 |
C语言程序设计教程(第三版)课后习题5.8 (C语言代码)浏览:683 |
DNA (C语言描述,蓝桥杯)浏览:1654 |
1009题解浏览:802 |