JAVA程序设计:游乐园的迷宫(LCP 15)
小王来到了游乐园,她玩的第一个项目是模拟推销员。有一个二维平面地图,其中散布着 N 个推销点,编号 0 到 N-1,不存在三点共线的情况。每两点之间有一条直线相连。游戏没有规定起点和终点,但限定了每次转角的方向。首先,小王需要先选择两个点分别作为起点和终点,然后从起点开始访问剩余 N-2 个点恰好一次并回到终点。访问的顺序需要满足一串给定的长度为 N-2 由 L 和 R 组成的字符串 direction,表示从起点出发之后在每个顶点上转角的方向。根据这个提示,小王希望你能够帮她找到一个可行的遍历顺序,输出顺序下标(若有多个方案,输出任意一种)。可以证明这样的遍历顺序一定是存在的。
(上图:A->B->C 右转; 下图:D->E->F 左转)
示例 1:
输入:points = [[1,1],[1,4],[3,2],[2,1]], direction = "LL"
输入:[0,2,1,3]
解释:[0,2,1,3] 是符合"LL"的方案之一。在 [0,2,1,3] 方案中,0->2->1 是左转方向, 2->1->3 也是左转方向
示例 2:
输入:points = [[1,3],[2,4],[3,3],[2,1]], direction = "LR"
输入:[0,3,1,2]
解释:[0,3,1,2] 是符合"LR"的方案之一。在 [0,3,1,2] 方案中,0->3->1 是左转方向, 3->1->2 是右转方向
限制:
3 <= points.length <= 1000 且 points[i].length == 2
1 <= points[i][0],points[i][1] <= 10000
direction.length == points.length - 2
direction 只包含 "L","R"
思路:在比赛时想到了和官方题解一样的思路:当需要左转时我们选择当前点左边的点中最右边的点,右转时同样的道理。代码写的太丑了,一直TLE,今天补了这道题,发现比赛时真的蠢,拿叉积判断就ok了。【参考:官方题解】
class Solution {public int[] visitOrder(int[][] points, String direction) {int size = 0;int n = points.length;int[] ans = new int[n];int len = direction.length();boolean[] used = new boolean[n];List<int[]> point = new ArrayList<>();for (int i = 0; i < n; i++)point.add(new int[]{points[i][0], points[i][1]});int start = 0;for (int i = 1; i < n; i++) {if (point.get(i)[0] < point.get(start)[0] ||point.get(i)[0] == point.get(start)[0] &&point.get(i)[1] < point.get(start)[1])start = i;}used[start] = true;ans[size++] = start;for (int i = 0; i < len; i++) {int next = -1;if (direction.charAt(i) == 'L') {for (int j = 0; j < n; j++) {if (!used[j]) {if (next == -1 || Cross(Sub(point.get(next), point.get(start)), Sub(point.get(j), point.get(start))) < 0)next = j;}}} else {for (int j = 0; j < n; j++) {if (!used[j]) {if (next == -1 || Cross(Sub(point.get(next), point.get(start)), Sub(point.get(j), point.get(start))) > 0)next = j;}}}used[next] = true;ans[size++] = next;start = next;}for (int i = 0; i < n; i++) {if (!used[i])ans[size++] = i;}return ans;}private int Cross(int[] a, int[] b) {return a[0] * b[1] - a[1] * b[0];}private int[] Sub(int[] a, int[] b) {return new int[]{a[0] - b[0], a[1] - b[1]};}
}
JAVA程序设计:游乐园的迷宫(LCP 15)相关推荐
- 软考中级(软件设计师)——面向对象程序设计(C++Java二选一的题15分-目标3分)
软考中级(软件设计师)--面向对象程序设计(C++&Java二选一的题15分-目标3分) 目录 软考中级(软件设计师)--面向对象程序设计(C++&Java二选一的题15分-目标3分) ...
- 《Java程序设计》第15周课堂实践总结
<Java程序设计>第15周课堂实践总结 实践一 教材代码检查-p242 要求 在IDEA中或命令行中运行P242 StackTraceDemo2.java 代码运行结果和教材一致吗?为什 ...
- Java程序设计经典习题15道
Java程序设计总复习题 1.编写一个Java程序在屏幕上输出"你好!".(p13,例1-1) //programme name Helloworld.java public cl ...
- java程序设计实验报告_JavA程序设计实验报告.doc
Java程序设计实验报告 学号: 姓名: 座位号: 实验日期: [实验名称]: JDK配置与开发工具的使用 [实验目的]: 熟悉JDK开发环境. 熟悉EditPlus编辑器或Eclipse等开发环境的 ...
- java程序运行结果题_(Java程序设计)试题
装 订 线 内 不 答 题 要 二.多选题 (每题2分,共10分) . A.Java 语言是面向对象的.解释执行的网络编程语言. B.Java 语言具有可移植性,是与平台无关的编程语言. C.Java ...
- 20155319 2016-2017-2 《Java程序设计》第七周学习总结
20155319 2016-2017-2 <Java程序设计>第七周学习总结 教材学习内容总结 第十二章 Lambda 如果使用JDK8的话,可以使用Lambda特性去除重复的信息. 在只 ...
- 20145129 《Java程序设计》第6周学习总结
20145129 <Java程序设计>第6周学习总结 教材学习内容总结 InputStream与OutStream 串流设计的概念 输入串流代表对象为java.io.InputStream ...
- Ways to 优化JAVA程序设计和编码,提高JAVA性能
通过使用一些辅助性工具来找到程序中的瓶颈,然后就可以对瓶颈部分的代码进行优化.一般有两种方案:即优化代码或更改设计方法.我们一般会选择后者,因为不去调用以下代码要比调用一些优化的代码更能提高程序的性能 ...
- 20155227 2016-2017-2 《Java程序设计》第九周学习总结
20155227 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 JDBC简介 JDBC全名Java DataBase Connectivity,是java联 ...
- 20155222 2016-2017-2 《Java程序设计》第10周学习总结
20155222 2016-2017-2 <Java程序设计>第10周学习总结 教材学习内容总结 简单JAVA socket * 1 搭建服务器端* 1 创建ServerSocket对象绑 ...
最新文章
- webrtc java api_WEBRTC--简单入门实例
- 茱莉亚分形_茱莉亚的NaN Constant
- 【我所認知的BIOS】—gt;ADU.exe
- java+线程安全的hash,多线程下HashMap安全问题-ConcurrentHashMap解析
- C++11 实现defer功能(转载)
- 凸二次规划的解法(旋转算法)
- CAN、CAN FD
- 【Python K均值聚类算法】
- 平流方程基于MATLAB数值解法,Matlab微分方程高效解法:谱方法原理与实现
- MATLAB代码:电-气-热综合能源系统耦合优化调度 关键词:综合能源系统 优化调度 电气热耦合 主要内容:代码主要做的是一个考虑电网、热网以及气网耦合调度的综合能源系统优化调度模型
- 电脑ping不通的原因
- scratch成绩查询 电子学会图形化编程scratch等级考试四级真题和答案解析2022年6月
- 狗狗大全(送给喜欢狗的人)
- 为什么我们要学习Microsoft Graph
- win10换win7系统步骤操作详解分享
- 【c++】设置控制台窗口字体颜色和背景色(system和SetConsoleTextAttribute函数 )
- 计算机网络——HTTP
- 王兴是怎么看待共享单车这块业务的
- 【历史上的今天】12 月 3 日:世界上第一条短信;Fortran 语言之父诞生;百度贴吧上线
- C语言函数大全-- l 开头的函数
热门文章
- 如何输入一个二进制:在开头+0b
- 计算机网络层次结构之OSI模型和TCP/IP模型
- mysql使用SQL语句创建表
- 信用卡通过消费日期计算还款日
- 项目实战01-openpyxl读取Excel
- Android V7包学习笔记更新中.....
- OFFICE安装报错:This installation requires a compatible Microsoft Office program installed on your comput
- 关于微信检测SDK应用的原理浅析(iOS)
- 服务器E盘找不到,Windows03系统D盘不见怎么办
- 基于JAVA的跳棋游戏的开发