【优秀题解】1175:台球碰撞

题号1174,原题见下图:

解题思路:

解题思路: 把台球看做质点(台球坐标不变,球桌坐标各个边界向里收缩R,得到新的球桌);

假设没边界,求出小球沿着直线的最后坐标x,y;

x,y在球桌内,返回输出否则;

判断小球与哪个边界相撞(判断方法有多中,我的和他们的比起来可能不高大上),以该边界为对称轴,翻转x,y;

再重复上述步骤;

(本应该用递归,但是栈溢出,改了循环)

具体还是看图把:

分解图:

注意事项: 球桌坐标各个边界向里收缩R,即上边界:w-R;

下边界:0+R;左边界:0+R;右边界:L-R;

(注意上下边界,不加R,测试数据也正确,但是大数据误差,出现答案错误)

参考代码:

#include <stdio.h>
#include <math.h>
int    n = 0;
double    X1, Y1, x, y, R;
void endpoint( double L, double W ); /* x,y is start point  X1,Y1 is end point */
int main()
{
    double L, W, a, v, s;
    scanf( "%lf%lf%lf%lf%lf%lf%lf%lf", &L, &W, &x, &y, &R, &a, &v, &s );
    while ( L != 0 && W != 0 && x != 0 && y != 0 && R != 0 && a != 0 && v != 0 && s != 0 )
    {
        a    = a * asin( 1 ) * 2 / 180;
        X1    = x + s*v*cos( a );
        Y1 = y + s*v*sin( a );
        while ( X1<0 || X1>L || Y1<0 || Y1>W )
        {
            endpoint( L - R, W - R );
        }
        if ( X1 >= 0 + R && X1 <= L && Y1 >= 0 + R && Y1 <= W )
        {
            printf( "%.2lf %.2lf\n", X1, Y1 );
        }
        scanf( "%lf%lf%lf%lf%lf%lf%lf%lf", &L, &W, &x, &y, &R, &a, &v, &s );
    }
/*for(int i=0;i<n;i++)
 * {
 * printf("%.2lf %.2lf\n",xx[i],yy[i]);
 *
 * }*/
    return(0);
}
void endpoint( double L, double W )
{
    double upx, downx, righty, lefty, slope;
    slope = (Y1 - y) / (X1 - x);
    upx    = (W - y) / slope + x;
    downx    = (0.0 + R - y) / slope + x;
    righty    = slope * (L - x) + y;
    lefty    = slope * (0.0 + R - x) + y;
    if ( Y1 > W && y < W && upx >= 0 + R && upx <= L )
    {
        x    = upx;
        y    = W;
        Y1 = Y1 - 2 * (Y1 - W);
        return;
    }  /* yu shangbianjie xiang jiao */
    else
    if ( Y1 < 0 + R && y > 0 + R && downx >= 0 + R && downx <= L )
    {
        x    = downx;
        y    = 0 + R;
        Y1 = Y1 - 2 * (Y1 - R);
        return;
    } /* yu xiabianjie */
    else
    if ( X1 > L && x < L && righty >= 0 + R && righty <= W )
    {
        x    = L;
        y    = righty;
        X1 = X1 - 2 * (X1 - L);
        return;
    } /* YU YOU BIANJIE */
    else
    if ( X1 < 0 + R && x > 0 + R && lefty >= 0 + R && lefty <= W )
    {
        x    = 0 + R;
        y    = lefty;
        X1 = X1 - 2 * (X1 - R);
        return;
    }
    return;
}

原文发布于微信公众号 - 编程范(dotcpp)

原文发表时间:2018-03-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT派

教程 | 如何使用TensorFlow和自编码器模型生成手写数字

本文详细介绍了如何使用 TensorFlow 实现变分自编码器(VAE)模型,并通过简单的手写数字生成案例一步步引导读者实现这一强大的生成模型。 全部 VAE ...

385110
来自专栏Coding迪斯尼

使用自动编解码器网络实现图片噪音去除

在前面章节中,我们一再看到,训练或使用神经网络进行预测时,我们需要把数据转换成张量。例如要把图片输入卷积网络,我们需要把图片转换成二维张量,如果要把句子输入LS...

12020
来自专栏AI研习社

放弃深度学习?我承认是因为线性代数

深度学习:作为机器学习的一个子域,关注用于模仿大脑功能和结构的算法:人工神经网络。

13920
来自专栏大数据挖掘DT机器学习

非监督学习算法:异常检测

什么是异常(outlier)?Hawkins(1980)给出了异常的本质性的定义:异常是在数据集中与众不同的数据,使人怀疑这些数据并非随机偏差,而是产生于完全不...

74450
来自专栏悦思悦读

【文本分析】怎样把文档转换成向量

文本分析 文本分析指从文本中抽取出的特征来量化来表示文本信息,并在此基础上对其进行基于数学模型的处理。它是文本挖掘、信息检索的一个基本问题。 在“大数据”盛行的...

641110
来自专栏潇涧技术专栏

Problem: Matrix Chain Problem

矩阵链乘问题是最典型的动态规划问题,本文介绍如何用动规算法解决这个问题,要理解下面的内容请先阅读这篇动态规划的总结。

6110
来自专栏AI研习社

手把手教你如何用 TensorFlow 实现基于 DNN 的文本分类

编者按:本文源自一位数据科学开发者的个人博客,主要面对初学者用户,AI 研习社编译。另外,关于 TensorFlow 和 DNN 的更多深度内容,欢迎大家在文末...

40890
来自专栏数据派THU

教你用TensorFlow和自编码器模型生成手写数字(附代码)

来源:机器之心 本文长度为1876字,建议阅读4分钟 本文介绍了如何使用 TensorFlow 实现变分自编码器(VAE)模型,并通过简单的手写数字生成案例一步...

31580
来自专栏机器之心

教程 | 从字符级的语言建模开始,了解语言模型与序列建模的基本概念

选自imaddabbura 机器之心编译 你有没有想过 Gmail 自动回复是如何进行的?或者手机在你输入文本时如何对下一个词提出建议?生成文本序列的通常方式是...

42250
来自专栏小樱的经验随笔

线性规划之单纯形法【超详解+图解】

1.作用     单纯形法是解决线性规划问题的一个有效的算法。线性规划就是在一组线性约束条件下,求解目标函数最优解的问题。 2.线性规划的一般形式     在约...

6K60

扫码关注云+社区

领取腾讯云代金券