# 【优秀题解】1175：台球碰撞

x，y在球桌内，返回输出否则；

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

（注意上下边界，不加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;
}```

312 篇文章45 人订阅

0 条评论

## 相关文章

385110

12020

13920

74450

641110

6110

40890

31580

42250

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

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

6K60