题目 1075: 台球碰撞
样例输入
100 100 80 10 5 90 2 23
110 100 70 10 5 180 1 9999
0 0 0 0 0 0 0 0
样例输出
80.00 56.00
71.00 10.00
思路(参考BornFated的思路)(【BornFated】1075_台球碰撞_C语言题解-Dotcpp编程社区):
A.本题的主要问题在于建模而不是编程,涉及到球在二维平面内的受边界限制的斜向运动
由于球在碰撞时,被碰的是球表面,所以我们考虑重新建立坐标系,具体如下
如图,矩形的两边边长都缩短了2R,此时我们便可以把球体抽象成一个质点。
B.由于球体做斜向运动,我们考虑将其运动进行分解,分开处理
先处理X轴,如图
由于题目中的起始坐标x不一定在原点上,所以我们可以把它看成从原点出发移动x个单位的运动,由于初速度方向不定,从原点出发, 无论是向左运动还是向右运动,它都会变成向右运动(向左瞬间碰壁反弹)举个例子:假设质点从 3 开始发生-27的位移,也就相当于是从原点开始发生了(-27+3)=(-24)的位移,也就相当于从原点开始发生了24的总位移,
值得注意的是,一旦总位移大于两倍的边长,它的实际位移就应该减去一个两倍边长,实际上,边界范围的两倍是一个周期。
综上所述:假设初始坐标为 x ,移动位移为 s ,边界长度为 L ,那么求解最终坐标的方法就是:先求出转化后的从原点出发的总位移 Dx,Dx=fabs(x+s),之后若 Dx 大于 2L 则 Dx-=2L 直到 Dx小于2L,最后若 Dx小于L 则 Dx 即最终坐标,若 Dx介于2L和L之间 ,那么最终坐标为 2L-Dx 。
最后把该思路推广到y轴上,便可以得出结论
代码如下:
#include<stdio.h>
#include<math.h>
void ZB(double L, double W, double x, double y, double R, double a, double v, double s, double Dx, double Dy);
int main()
{double L[26], W[26], x[26], y[26], R[26], a[26], v[26], s[26];double Dx = 0, Dy = 0;int i,j=0;for ( i = 0; i < 26; i++){scanf("%lf%lf%lf%lf%lf%lf%lf%lf", &L[i], &W[i], &x[i], &y[i], &R[i], &a[i], &v[i], &s[i]);if (L[i] == 0 && W[i] == 0 && x[i] == 0 && y[i] == 0 && R[i] == 0 && a[i] == 0 && v[i] == 0 && s[i] == 0){j = i;break;}}for ( i = 0; i < j; i++){ZB(L[i], W[i], x[i], y[i], R[i], a[i], v[i], s[i],Dx,Dy);}return 0;
}
void ZB(double L, double W, double x, double y, double R, double a, double v, double s,double Dx,double Dy)
{double l, w, x0, y0;a = a / 180.0 * acos(-1);l = L - 2 * R;w = W - 2 * R;x0 = x - R;y0 = y - R;Dx = fabs(v * s * cos(a) + x0);Dy = fabs(v * s * sin(a) + y0);while (Dx > 2 * l){Dx -= 2 * l;}while (Dy > 2 * w){Dy -= 2 * w;}if (Dx > l && Dx < 2 * l) Dx = 2 * l - Dx;else;if (Dy > w && Dy < 2 * w) Dy = 2 * w - Dy;else;printf("%.2lf %.2lf\n", Dx + R, Dy + R);}
题目 1075: 台球碰撞相关推荐
- C语言网 蓝桥杯训练 1075 台球碰撞
样例输入 100 100 80 10 5 90 2 23 110 100 70 10 5 180 1 9999 0 0 0 0 0 0 0 0 样例输出 80.00 56.00 71.00 10.00 ...
- NYOJ 665 台球碰撞
台球碰撞 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 在平面直角坐标系下,台球桌是一个左下角在(0,0),右上角在(L,W)的矩形.有一个球心在(x,y),半径为R的 ...
- 【算法修炼】台球碰撞 C
台球碰撞 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 在平面直角坐标系下,台球桌是一个左下角在(0,0),右上角在(L,W)的矩形.有一个球心在(x,y),半径为R的 ...
- 椭圆台球桌中台球碰撞模拟
题目:椭圆台球桌中台球碰撞模拟 内容: 掌握二维光线跟踪方法: 功能要求: (1)构建一张椭圆形台球桌: (2)使用鼠标指定椭圆内的一个随机起点S和方向c: (3)台球从S点出发,沿方向c按直线前进, ...
- 完全碰撞问题 台球碰撞
问题描述 在平面直角坐标系下,台球桌是一个左下角在(0,0),右上角在(L,W)的矩形.有一个球心在(x,y),半径为R的圆形母球放在台球桌上(整个球都在台球桌内).受撞击后,球沿极角为a的射线(即: ...
- 编程习题练习记录--台球碰撞
在平面直角坐标系下,台球桌是一个左下角在(0,0),右上角在(L,W)的矩形.有一个球心在(x,y),半径为R的圆形母球放在台球桌上(整个球都在台球桌内).受撞击后,球沿极角为a的射线(即:x正半轴逆 ...
- c语言坐标如何判定碰撞,台球碰撞 (C语言代码)
题目分析 具体看代码吧 代码#include #include int main() { double L,W,x,y,R,a,v,s; double dx,dy; while(scanf(" ...
- 基于Seajs的可控台球碰撞游戏
前言 不记得哪个黑色星期五,贪吃鱼基本完工的时候,产品突然增加需求,要求金币扔出去后不消失,互相可碰撞,其最终结果还要由服务器控制(没错,至今做的所有游戏都有幕后黑手,=W=). 对于碰撞以前只写过一 ...
- java 编写台球代码_台球碰撞 (Java代码)
解题思路: 注意事项: 参考代码:import java.util.Scanner; public class C1075 { public static void main(String[] arg ...
最新文章
- 物联网白皮书【2018】重磅发布|今年的物联网产业交出了一张怎样的答卷
- python3 四舍五入
- 【解决没有该选项问题】使Clion运行编译运行单个C/C++文件(Single File Execution插件)
- 大数据可视化设计到底是啥,该怎么用
- webapi 找到了与请求匹配的多个操作(ajax报500,4的错误)
- 单应矩阵,基本矩阵,本质矩阵
- 杜绝网上压根没测过就乱写之 《oracle mybatis 返回自增主键 》
- 计算机网络布线总结,网络综合布线实训总结
- 如何用计算机算分数乘法,分数乘法怎么算
- c++二进制转化成十进制
- win10一根网线连接linux,细说win10系统使用一根网线连接两台电脑的设置教程_
- 数据库优化之泛泛而谈
- 大数据技术有什么特点
- 并行传输和串行传输的区别
- windows更改密码脚本_如何更改您的Windows密码
- rust服务器假人文件,最新武林最新GM命令大全(精睿提取) - Welcome to XiongTianQi.CN...
- 我的王姨!YYDS!富婆这套路实在是太深了...
- 怎么做好一件复杂的事情 No.201
- Web自动化-浏览器驱动chromedriver安装方法(mac)
- UG10.0汽车冲压连续模具设计视频教程 AutoForm分析