问题:
许多交通锥已放置在圆形跑道上,以形成障碍物。您被要求确定可以在路线上行驶的最大尺寸的汽车。为简单起见,假设圆锥的宽度为零,并且汽车是完美的圆形且可无限机动。轨道本身是两个同心圆之间的区域。
形式上,如果在轨道中心周围存在一个位于形成轨道的圆之间的闭环,并且该环上的每个点距每个圆锥至少 c 距离,则该路线可以由半径为 c 的汽车导航,并且轨道的每个边界。
我的方法:
找到每对点之间的距离,然后为集合中的每个点在同一集合中找到离它最近的点。让这个距离dist[i]
为第 i 点,并与 比较dist[i]
,max((inner_radius-dist),(outer_radius-dist))
哪个更小是汽车的半径。
我对这个逻辑进行了编码,但我得到了错误的答案。我不确定我的算法是否正确。有人可以验证或建议更好的算法。
[编辑] 以下是中的代码c++
c
#include <stdio.h>
#include <math.h>
#define TEST_SIZE 500
/* This code is plain C so no need for this line:
using namespace std; */
int main(void) {
int testCases, n;
float x[TEST_SIZE], y[TEST_SIZE];//x[i], y[i] constitute pair (x,y) for ith point
float distance, dist, min, r, R,radius;
scanf("%d", &testCases);
while ( testCases-- ) {
scanf("%f%f%d", &r,&R, &n);
//printf("r: %f, R: %f, n: %d\n", r, R, n);
for (int i=0; i<n ; i++) {
scanf("%f%f", &x[i], &y[i]);
}
for(int i=0; i<n; ++i) {
for(int j=0; j<n; ++j) {
if (j!=i) {
dist = ((x[i]-x[j])*(x[i]-x[j])) + ((y[i]-y[j])*(y[i]-y[j]));// rhs of this equation is square of distance between 2 points
if(j==0 || dist>min) {
min=dist;
}
// printf("dist: %f\n", dist);
}
}
min=sqrt(min);
radius=sqrt((x[i]*x[i]) + (y[i]*y[i]));
if(radius-r > R-radius) {
if(min>radius-r) {
min=radius-r;
}
} else {
if(min>R-radius) {
min=R-radius;
}
}
if(i==0 || distance>min) {
distance = min;
}
}
distance = floorf(distance*1000 + .5)/1000;
//printf("distance: %f\n", distance);
printf ("%f\n", distance);
}
return 0;
}