通过增加坐标直到欧氏距离 <= D 来确定获胜者(C++)2024 年 08 月 29 日 | 阅读 9 分钟 引言在此 C++ 方法中,目标是通过系统地递增坐标值,直到从原点开始的欧几里得距离小于或等于指定的 D,来确定一组获胜的坐标。该算法从二维平面上原点 (0,0) 的初始坐标开始,并采用系统递增策略。欧几里得距离,使用距离公式计算,作为确定获胜坐标的标准。此方法确保了对坐标空间的结构化探索,同时递增x和y值,直到满足所需的距离条件。此方法的简洁性和清晰性使其成为系统且可预测地找到指定欧几里得距离内获胜点的有效方式。 程序输出 Enter the maximum distance (D): 5 The winner coordinates are: (0, 0) 说明
该代码旨在通过逐渐递增 x 和 y 值来找到一组获胜坐标,直到从原点 (0,0) 到这些坐标的欧几里得距离小于或等于指定的 D。
calculateDistance 函数使用熟悉的距离公式:sqrt((x2 - x1)^2 + (y2 - y1)^2) 来计算两点之间的欧几里得距离。 主逻辑
程序首先提示用户输入允许的最大距离 (D)。
代码使用嵌套循环遍历可能的坐标值。
对于每一组坐标(x, y),它使用 calculateDistance 函数计算与原点 (0,0) 的欧几里得距离。
如果计算出的距离小于或等于指定的 D,则认为这些坐标是获胜的,并且循环中断。
最后,程序输出获胜的坐标。
无限循环的使用是故意的。外层循环持续进行,直到找到一组获胜的坐标。内层循环无限期地持续进行,直到满足特定 x 值的获胜条件。这确保了对获胜坐标的系统搜索。 复杂度分析 时间复杂度 由于存在无限循环,代码的时间复杂度并不直接。嵌套循环递增 x 和 y 坐标,直到满足获胜条件,并且此过程可能会无限期地持续进行,直到找到一组合适的坐标。因此,时间复杂度最好描述为无限或无界。 空间复杂度 该代码的空间复杂度很小且恒定。它不使用任何会导致显著内存使用的数据结构或算法。主要的内存消耗与x、y、D、距离以及获胜坐标x_winner 和 y_winner 等变量相关。这些变量占用的内存量是恒定的,与输入值无关。因此,空间复杂度被认为是恒定的或O(1)。 方法 1:使用带步长增量的线性搜索该方法采用系统线性搜索策略来查找最大欧几里得距离 (D) 内的坐标。 它从原点 (0, 0) 开始,并通过固定的步长迭代地增加 x 和 y 坐标。 程序输出 Enter the maximum distance (D): 5 The winner coordinates are: (0, 0) 说明
stepSize 设置为 1,表示在每次迭代中坐标将增加的量。 D 是允许的最大距离,程序将使用它来查找获胜的坐标。
用户被提示输入允许的最大距离 (D)。
x 和 y 初始化为 0,代表二维平面中的起点(原点)。
程序进入无限循环(while (true))以执行获胜坐标的线性搜索。
使用距离公式计算从原点 (0,0) 到当前坐标 (x, y) 的欧几里得距离。 如果计算出的距离小于或等于指定的最大距离 (D),则当前坐标被视为获胜者。 然后显示获胜的坐标,并中断循环。
如果未满足距离条件,则在每次迭代中将坐标(x 和 y) 按 stepSize 递增。 这种增量确保程序系统地探索二维平面中的不同点。
最终输出显示获胜的坐标,提供满足从原点开始的指定最大距离条件的点。 复杂度分析 时间复杂度 代码的时间复杂度由while (true) 循环中的迭代次数决定。 由于循环以固定的 stepSize 递增x 和 y,直到找到获胜的坐标,因此时间复杂度是迭代次数的线性函数。 如果我们表示迭代次数为 N,则时间复杂度为 O(N)。 空间复杂度 代码的空间复杂度是恒定的(O(1)),因为无论输入如何,它使用的内存量是固定的。 变量stepSize、D、x、y 和 distance 在程序执行期间都占用恒定的内存量。 这些变量所需的空间不随输入的大小而增长。 方法 2:使用二次搜索进行对角线移动该方法采用系统二次搜索策略来查找最大欧几里得距离 (D) 内的坐标。 它从原点 (0, 0) 开始,并以二次模式增量移动,从而在对角线上覆盖更多区域。 程序输出 Enter the maximum distance (D): 5 The winner coordinates are: (0, 0) 说明
用户被提示输入允许的最大距离(D)。
x 和 y 初始化为 0,代表二维平面中的起点(原点)。
程序进入无限循环(while (true))以执行带对角线移动的二次搜索以查找获胜的坐标。
使用距离公式计算从原点 (0,0) 到当前坐标(x, y) 的欧几里得距离。 如果计算出的距离小于或等于指定的 D,则当前坐标被视为获胜者。 然后显示获胜的坐标,并中断循环。
如果未满足距离条件,则以二次方式递增坐标 (x 和 y)。 在每次迭代中,将x 和 y 中较大的值添加到x 和 y 中。 这种二次增量模式允许程序更快地覆盖二维平面中的更大区域。
最终输出显示获胜的坐标,提供满足从原点开始的指定最大距离条件的点。 复杂度分析 时间复杂度 时间复杂度取决于while (true) 循环中的迭代次数。 该循环执行二次搜索模式,其中迭代次数受坐标x和y的增长影响。 时间复杂度可视为二次方,表示为O(N^2),其中N是找到获胜坐标所需的迭代次数。 空间复杂度 空间复杂度是恒定的,表示为O(1),因为程序的内存使用量与输入值无关。 变量D、x、y 和 distance 在程序执行期间都占用恒定的内存量。 这些变量所需的空间不随输入大小而增长。 方法 3:带收敛的随机搜索该方法使用随机搜索策略来查找最大欧几里得距离 (D) 内的坐标。 它从指定范围内的随机初始坐标开始,并迭代地随机调整坐标。 程序输出 Enter the maximum distance (D): 6 The winner coordinates are: (-3, 5) 说明
用户输入允许的最大距离(D)。
使用rand()函数在[-D, D]范围内选择随机初始坐标(x 和 y)。 srand(time(0))调用根据当前时间播种随机数生成器。
在每次迭代中,程序计算从原点到当前坐标的欧几里得距离。 如果计算出的距离小于或等于 D,则当前坐标被视为获胜者,程序终止。 否则,它会随机调整坐标以探索二维平面的不同区域。
在每次迭代中,都会对x和y进行随机调整。 调整范围在[-D, D]内,为搜索引入随机性。
随机调整会在坐标中产生变异。 经过多次迭代,随机性倾向于收敛到满足欧几里得距离条件的坐标。
一旦找到获胜的坐标,程序就会输出它们。 复杂度分析 时间复杂度 由于其随机性质,该方法的时间复杂度很难精确确定。 平均而言,时间复杂度预计会相对较高,因为它取决于找到指定欧几里得距离内坐标所需的迭代次数。 平均时间复杂度可能近似为 O(N),其中N是所需迭代次数的平均值。 空间复杂度 空间复杂度是恒定的,表示为O(1),因为程序的内存使用量与输入值无关。 变量 D、x、y、distance 以及随机数生成变量在程序执行期间都占用恒定的内存量。 这些变量所需的空间不随输入的大小而增长。 下一个主题如何在 C++ 中从不同函数访问局部变量 |
C++ 标准模板库 STL 提供了强大的字符串操作实用程序。其中,在处理正则表达式时,std::match_results 子句非常重要。在本博文中,我们将深入探讨 std::match_results 的 empty() 成员函数,并研究其语言表达式、函数和用例...
阅读 3 分钟
什么是二叉树?二叉树是一种数据结构,由分层组织的节点组成。每个节点最多有两个子节点,通常是左子节点和右子节点。根节点是树中最顶端的节点,叶节点是...
阅读 16 分钟
C++ 编程语言中主要有四种预处理器指令,它们是:- 宏 文件包含 条件编译 其他指令 宏 C/C++ 编程语言中的宏是最令人兴奋的概念之一。它们是用 #define 编写的 C++ 代码中的句子,每当...
阅读 3 分钟
在 C++ 编程世界中,开发人员经常面临管理数据并确保其符合特定边界的任务。这时 C++ 标准库中的 'clamp' 函数就派上用场了。'Clamp' 是一个多功能且有用的工具,它允许...
7 分钟阅读
C++ 模板与 Java 泛型 在开发大型项目时,我们需要代码能够与提供给它的任何类型的数据兼容。这就是您编写的代码与其他代码区分开来的地方。我们在这里的意思是,您编写的代码应该...
阅读 3 分钟
在本文中,您将了解堆和树及其类型和示例之间的比较。什么是堆?满足堆属性的专用基于树的数据结构称为堆。父节点和子节点之间的关系由此属性决定,...
阅读 10 分钟
编码中的数学谜题入门 编码中的数学谜题结合了数学和逻辑的力量,创造了引人入胜的挑战,可以测试解决问题的能力和算法思维。这些谜题通常为经验丰富的程序员和初学者提供了引人入胜的练习,提供了一种愉快的磨练...
阅读9分钟
在基类中声明了关键字 virtual 的成员函数,并在派生类中重新定义(重写)的函数称为虚函数。后期绑定指令指示编译器在运行时执行调用的函数,通过……
阅读 3 分钟
在本文中,我们将讨论 C++ 中 std::lower_bound 和 std::set::lower_bound 函数之间的区别。但在讨论它们的区别之前,我们必须了解 std::lower_bound 和 std::set::lower_bound 函数。C++ 中的 std::lower_bound 函数是什么? std::lower_bound 函数检测排序范围内的第一个位置,在该位置可以...
5 分钟阅读
字符串操作是编程的基本活动,并且在字符串中更改字符的大小写是一个常见的过程。在本教程中,我们将介绍编写一个 C++ 程序来在字符串中切换大小写。确定问题:将大写转换为小写,将小写转换为大写……
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India