北向眼


私信TA

用户名:uq_91541132464

访问量:2236

签 名:

题解都是为了做笔记,备战中

等  级
排  名 1880
经  验 2491
参赛次数 1
文章发表 15
年  龄 20
在职情况 学生
学  校 江西财经大学
专  业 软件工程

  自我简介:

题解都是为了做笔记,备战中 //更新,javaB国一已拿,转战Acwing

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 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区