news 2026/1/18 1:50:09

经典算法题详解之游乐园的迷宫(三)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
经典算法题详解之游乐园的迷宫(三)

解决方案

平面上有 个点,找到一条访问 个点的路径,使得路径的转角满足给定的转角序列。

题解

我们保持一个理想的状态:转向时,剩余的点都位于要求方向的一侧(即剩余点都符合当前这次的转向要求)。那么当前这次转向选择什么点,可以使下一次转向依旧满足这个理想的状态,从而可以不断的递归找下去。

若下一次转向的要求方向是 L (R),则这次转向的点中选择相对方向最右(最左)的点即可。

C++ 实现

class Solution { private: pair<int, int> Sub(pair<int, int> a, pair<int, int> b) { // 求点 a 到点 b 的向量 return make_pair(a.first - b.first, a.second - b.second); } int Cross(pair<int, int> a, pair<int, int> b) { // 求向量 a 到向量 b 的向量叉积 return a.first * b.second - a.second * b.first; } public: vector<int> visitOrder(vector< vector<int> >& points, string dir) { int n = points.size(); vector<bool> used(n, false); // 记录点的遍历情况, False未遍历 / True已遍历 vector< pair<int, int> > point; vector<int> order; // 记录返回结果 for (int i=0; i<n; ++i) { point.push_back( make_pair(points[i][0], points[i][1]) ); } // 查找最左的点作为 起始点 int start = 0; for (int i=1; i<n; ++i) { if (point[i] < point[start]) { start = i; } } used[start] = true; order.push_back(start); for (int i=0; i<dir.size(); ++i) { int next = -1; if (dir[i] == 'L') { // 转向方向为 L,选择相对方向最右的点 for (int j=0; j<n; ++j) { if (!used[j]) { if (next == -1 || Cross(Sub(point[next], point[start]), Sub(point[j], point[start])) < 0) { next = j; } } } } else if (dir[i] == 'R') { // 转向方向为 R,选择相对方向最左的点 for (int j=0; j<n; ++j) { if (!used[j]) { if (next == -1 || Cross(Sub(point[next], point[start]), Sub(point[j], point[start])) > 0) { next = j; } } } } // 返回结果加入选择的点,更新下一次转向的起点 used[next] = true; order.push_back(next); start = next; } // 添加最后一个剩余点 for (int i=0; i<n; ++i) { if (used[i] == false) { order.push_back(i); } } return order; } };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/14 18:38:34

购物车小球动画:点击商品生成飞向购物车的小球动画

最近做了一个小需求&#xff0c;写购物车小球动画效果,给大家分享一下这个功能的源码&#xff0c;以便以后的使用。实现逻辑 每次点击时&#xff0c;拿到点击的位置作为小球的开始位置&#xff0c;再获取到购物车的结束位置。确定了两端位置之后&#xff0c;给小球设置css的pat…

作者头像 李华
网站建设 2025/12/27 12:31:57

16、文档编写工具与 XML 的使用指南

文档编写工具与 XML 的使用指南 1. 基础文档编写工具 1.1 纯文本文件的使用 在文档编写中,最小的实体是纯文本文件。只要文件包含的信息不过多,采用简单的结构就足够了。这里不需要使用 XML,通过标题、段落、缩进以及条目间留出足够的空间,就可以对信息进行结构化处理。…

作者头像 李华
网站建设 2025/12/22 7:02:23

21、Unix/Linux 系统安全与网络监控指南

Unix/Linux 系统安全与网络监控指南 1. 文件传输安全 在 Unix/Linux 系统中,文件传输是常见操作。当地址中省略用户名部分时,系统会使用当前用户名。若要保留文件的权限和所有权,可使用 -p 选项;若要复制目录树,则使用 -r (递归)选项。例如: erikk@unixhost>…

作者头像 李华
网站建设 2026/1/3 3:25:45

如何使用VSCode开发Arduino项目

安装必要插件在VSCode中安装官方扩展"PlatformIO IDE"或"Arduino"。PlatformIO功能更全面&#xff0c;支持多平台开发&#xff1b;Arduino扩展更轻量&#xff0c;适合简单项目。配置开发环境PlatformIO方式&#xff1a; 安装完成后&#xff0c;左侧工具栏会…

作者头像 李华
网站建设 2026/1/12 7:29:29

端到端测试优化:Cypress并行执行提速300%

在持续交付成为主流的今天&#xff0c;端到端测试作为确保软件质量的关键环节&#xff0c;其执行效率直接关系到产品迭代速度。传统的线性测试模式在面对复杂业务场景时往往成为瓶颈&#xff0c;而Cypress作为现代Web测试框架&#xff0c;通过并行化改造实现300%的效率跃升&…

作者头像 李华