样例输入

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: 台球碰撞相关推荐

  1. 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 ...

  2. NYOJ 665 台球碰撞

    台球碰撞 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 在平面直角坐标系下,台球桌是一个左下角在(0,0),右上角在(L,W)的矩形.有一个球心在(x,y),半径为R的 ...

  3. 【算法修炼】台球碰撞 C

    台球碰撞 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 在平面直角坐标系下,台球桌是一个左下角在(0,0),右上角在(L,W)的矩形.有一个球心在(x,y),半径为R的 ...

  4. 椭圆台球桌中台球碰撞模拟

    题目:椭圆台球桌中台球碰撞模拟 内容: 掌握二维光线跟踪方法: 功能要求: (1)构建一张椭圆形台球桌: (2)使用鼠标指定椭圆内的一个随机起点S和方向c: (3)台球从S点出发,沿方向c按直线前进, ...

  5. 完全碰撞问题 台球碰撞

    问题描述 在平面直角坐标系下,台球桌是一个左下角在(0,0),右上角在(L,W)的矩形.有一个球心在(x,y),半径为R的圆形母球放在台球桌上(整个球都在台球桌内).受撞击后,球沿极角为a的射线(即: ...

  6. 编程习题练习记录--台球碰撞

    在平面直角坐标系下,台球桌是一个左下角在(0,0),右上角在(L,W)的矩形.有一个球心在(x,y),半径为R的圆形母球放在台球桌上(整个球都在台球桌内).受撞击后,球沿极角为a的射线(即:x正半轴逆 ...

  7. c语言坐标如何判定碰撞,台球碰撞 (C语言代码)

    题目分析 具体看代码吧 代码#include #include int main() { double L,W,x,y,R,a,v,s; double dx,dy; while(scanf(" ...

  8. 基于Seajs的可控台球碰撞游戏

    前言 不记得哪个黑色星期五,贪吃鱼基本完工的时候,产品突然增加需求,要求金币扔出去后不消失,互相可碰撞,其最终结果还要由服务器控制(没错,至今做的所有游戏都有幕后黑手,=W=). 对于碰撞以前只写过一 ...

  9. java 编写台球代码_台球碰撞 (Java代码)

    解题思路: 注意事项: 参考代码:import java.util.Scanner; public class C1075 { public static void main(String[] arg ...

最新文章

  1. 物联网白皮书【2018】重磅发布|今年的物联网产业交出了一张怎样的答卷
  2. python3 四舍五入
  3. 【解决没有该选项问题】使Clion运行编译运行单个C/C++文件(Single File Execution插件)
  4. 大数据可视化设计到底是啥,该怎么用
  5. webapi 找到了与请求匹配的多个操作(ajax报500,4的错误)
  6. 单应矩阵,基本矩阵,本质矩阵
  7. 杜绝网上压根没测过就乱写之 《oracle mybatis 返回自增主键 》
  8. 计算机网络布线总结,网络综合布线实训总结
  9. 如何用计算机算分数乘法,分数乘法怎么算
  10. c++二进制转化成十进制
  11. win10一根网线连接linux,细说win10系统使用一根网线连接两台电脑的设置教程_
  12. 数据库优化之泛泛而谈
  13. 大数据技术有什么特点
  14. 并行传输和串行传输的区别
  15. windows更改密码脚本_如何更改您的Windows密码
  16. rust服务器假人文件,最新武林最新GM命令大全(精睿提取) - Welcome to XiongTianQi.CN...
  17. 我的王姨!YYDS!富婆这套路实在是太深了...
  18. 怎么做好一件复杂的事情 No.201
  19. Web自动化-浏览器驱动chromedriver安装方法(mac)
  20. UG10.0汽车冲压连续模具设计视频教程 AutoForm分析

热门文章

  1. EngineerCMS在linux下部署,并采用docker、onlyoffice实现文档协作
  2. 【matlab笔记】二维/三维隐函数绘图
  3. 浅析百分百还原网站效果图的可行性分析
  4. Knapsack Problem
  5. 计算机组成原理 程序计数器和寄存器的长度
  6. 软件测试自学怎么学?【史上最详细学习路线】(附全套资料)
  7. 利用历史数据做商业预测的全过程
  8. MATLAB 离散傅里叶变换(DFT)、逆离散傅里叶变换(IDFT)、快速傅里叶变换(FFT)的实现
  9. 使用 Amazon SageMaker JumpStart 更轻松地在组织内共享 ML 模型和笔记本
  10. 数据结构——王卓老师PPT