当前位置: 首页 > news >正文

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

解决方案

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

题解

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

若下一次转向的要求方向是 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; } };
http://www.cnnetsun.cn/news/23510.html

相关文章:

  • EasyPoi 数据脱敏
  • 收藏必备!GPT-5.2震撼发布:OpenAI反击战,职场程序员的AI新神器
  • 3步上手Sparta:让网络安全渗透测试变得像玩游戏一样简单
  • Android媒体画廊应用终极指南:轻量级隐私保护的完美选择
  • FT8371A,FT8371B,FT8371C 次边同步整流芯片典型应用资料分析
  • 智慧文旅信创落地新标杆:四川省文旅厅完成MySQL 5.7平滑替换,筑牢省级管理平台自主可控底座
  • 7、Unix/Linux 网络监控与日志管理全解析
  • 11、数据备份与系统安装全攻略
  • 12、Unix/Linux 系统设置与生产准备全攻略
  • 5步掌握网页数据采集:零代码工具完全操作手册
  • 15、测试系统与“安全”系统
  • TradingAgents-CN实战指南:从零开始构建你的AI交易智能体团队
  • 18、系统与网络安全全解析
  • 检索增强生成(RAG)在Java应用中的实践指南
  • 机器学习测试神器TensorFlow Model Analysis实战
  • Monitorian:多显示器亮度调节的终极解决方案,一键掌控视觉舒适度
  • 2025 主流 GEO 优化服务商 TOP4,助力 ToB 精准选型
  • 影刀RPA×AI双剑合璧!小红书商品图片批量上传,效率提升50倍![特殊字符]
  • 从中国出发,向世界展示!AI开发者亚马逊云科技狂欢专属攻略!
  • WPF SynchronizationContext的使用
  • 影刀RPA实战:AI智能生成小红书销售日报,3分钟搞定全天数据![特殊字符]
  • Sossoldi跨平台部署完全指南:从开发到上线的财富管理应用构建
  • 终极韩语NLP指南:快速掌握KoNLPy核心功能
  • 2026年大模型技术产业化浪潮:岗位需求激增,AI大模型工程师成为高薪稀缺人才!
  • 学生党必看免费亲测降ai率工具,这些坑你别踩
  • CentOS7 交叉编译 ACE+TAO-6.5.13 安卓 arm64-v8a 静态库
  • AIGC 版权争夺战:生成内容的归属、侵权与保护难题破解
  • 如何快速使用ChromePass:完整的Chrome浏览器密码提取指南
  • Obsidian个性化定制全攻略:从基础美化到专业界面设计
  • nvm-desktop终极指南:一站式解决Node.js版本管理难题