gpt4 book ai didi

c++ - 如何解决这个挑战

转载 作者:行者123 更新时间:2023-12-01 14:33:28 25 4
gpt4 key购买 nike

我有一个点 0-360 的圆,第一个点和最后一个点相连,取点 11 和 216。现在,给出任何一点,我如何找到它是否接近 11 或 216。我需要一个通用算法。例如:如果给定点 20,它应该发现它接近 11,而当给定 200 时,它应该找到接近 216。到这一点很容易,但是对于点 350,它应该发现它接近 11,而不是 216。我有这个公式,但它不适用于第三种情况:

 int find_point(int a){
int temp1=(a>=11?a-11:11-a);
int temp2=(a>=216?a-216:216-a);
if(temp1<temp2)
return 11;
else
return 216;
}

最佳答案

这就是圆的诀窍——它是圆的。

所以,从圆上的一个点到另一个点总是有两种方法,一种是左边的,一种是右边的。如果这些点不在同一直径上,那么一条路将比另一条路短。

另一个技巧是在 360° 处有一个环绕,因为 360° 和 0° 实际上是相同的角度(因为,见上文 - 圆是圆的)。

一个例子:

5°和355°之间的最小距离:

|355 - 5| = 350

但正确答案是 10。

如果 360° 加上 5:

|355 - 365| = 10

因此,我的简单想法是检查 a、a + 360 和 a - 360。因此,应该涵盖任何环绕。计算出的一些距离甚至可能超过 360 度,但它们不会受到影响,因为已搜索到最小值。

#include <algorithm>
#include <iostream>
int get_dist(int a, int b)
{
return std::min({ abs(a - b), abs(a + 360 - b), abs(a - 360 - b) });
}

int find_point(int a)
{
int d11 = get_dist(a, 11);
int d216 = get_dist(a, 216);
return d11 < d216 ? 11 : 216;
}

int main()
{
std::cout << "20 is closest to " << find_point(20) << '\n';
std::cout << "200 is closest to " << find_point(200) << '\n';
std::cout << "350 is closest to " << find_point(350) << '\n';
}

输出:

20 is closest to 11
200 is closest to 216
350 is closest to 11

Live Demo on coliru

也许,这不是最优雅但简单且易于维护的解决方案(忽略代码中的 magic numbers)。

关于c++ - 如何解决这个挑战,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61211788/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com