【优秀题解】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 条评论
登录 后参与评论

相关文章

来自专栏xiaoxi666的专栏

矩阵求逆的几种方法总结(C++)

文内程序旨在实现求逆运算核心思想,某些异常检测的功能就未实现(如矩阵维数检测、矩阵奇异等)。

1971
来自专栏机器之心

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

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

3775
来自专栏机器之心

学界 | 谷歌大脑提出对抗正则化方法,显著改善自编码器的泛化和表征学习能力

无监督学习的目标之一是不依靠显式的标注得到数据集的内在结构。自编码器是一种用于达成该目标的常见结构,它学习如何将数据点映射到隐编码中——利用它以最小的信息损失来...

802
来自专栏IT派

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

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

36211
来自专栏Coding迪斯尼

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

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

782
来自专栏风口上的猪的文章

机器学习(1) - TensorflowSharp 简单使用与KNN识别MNIST流程

机器学习是时下非常流行的话题,而Tensorflow是机器学习中最有名的工具包。TensorflowSharp是Tensorflow的C#语言表述。本文会对Te...

1463
来自专栏AI研习社

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

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

992
来自专栏kangvcar

[face_recognition中文文档] 第4节 Face Recognition API

1662
来自专栏数据科学与人工智能

【数据分析】异常值检测

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

4386
来自专栏数据派THU

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

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

2728

扫码关注云+社区