checkStraightLine-缀点成线

题意

在一个 XY 坐标系中有一些点,我们用数组 coordinates 来分别记录它们的坐标,其中 coordinates[i] = [x, y] 表示横坐标为
x、纵坐标为 y 的点。

请你来判断,这些点是否在该坐标系中属于同一条直线上,是则返回 true,否则请返回 false。

示例 1:

在这里插入图片描述

输入:coordinates = [[1,2],[2,3],[3,4],[4,5],[5,6],[6,7]]
输出:true

示例 2:
在这里插入图片描述

输入:coordinates = [[1,1],[2,2],[3,4],[4,5],[5,6],[7,7]]
输出:false

提示:

2 <= coordinates.length <= 1000
coordinates[i].length == 2
-10^4 <= coordinates[i][0], coordinates[i][1] <= 10^4
coordinates 中不含重复的点

Related Topics 几何 数组 数学

解题思路

较为简单,直接代码演示

代码演示:

class Solution {
    public boolean checkStraightLine(int[][] coordinates) {
            if(coordinates.length==2)
                return true;
            //判断所求线是否垂直于x轴
           if(coordinates[1][0]==coordinates[0][0])
           {
               for (int i = 2; i < coordinates.length; i++) {
                   if(coordinates[i][0]!=coordinates[0][0])
                       return false;
               }
           }
           else
           {
               //求直线的斜率,如果两点的斜率一致,则可以保证在同一条直线上
               double a=(coordinates[1][1]-coordinates[0][1])*1.0/(coordinates[1][0]-coordinates[0][0]);
               for (int i = 2; i < coordinates.length; i++) {
                   double b = (coordinates[i][1] - coordinates[0][1])*1.0 / (coordinates[i][0] - coordinates[0][0]);
                   if(a!=b)
                       return false;
               }
           }

        return true;
    }
}

运行效果

info
解答成功:
执行耗时:0 ms,击败了100.00% 的Java用户
内存消耗:37.9 MB,击败了82.88% 的Java用户

<think>嗯,用户问的是关于安卓Studio的连连看实验作业,需要我来介绍一下。首先,我得确定用户的需求是什么。可能是一个学生,正在做Android开发的课程作业,需要完一个连连看的游戏项目。他可能需要了解这个实验的基本要求、实现步骤、技术要点以及可能遇到的问题。 首先,我应该回忆一下连连看游戏的基本规则。连连看通常需要两个相同的图案,且连接路径不能超过两次转弯,路径不能被其他图案阻挡。在Android Studio中实现的话,需要涉及UI设计、触摸事件处理、游戏逻辑判断等。 接下来,用户可能需要知道如何开始这个项目。我应该分步骤来介绍,比如界面设计、数据结构、游戏逻辑、音效等。可能还需要提到使用的技术,比如使用GridView来布局图标,自定义Adapter,处理点击事件,判断连通性算法等。 然后,要考虑用户可能的难点在哪里。比如连通性算法的实现,可能涉及到广度优先搜索或者判断三种情况:直线连通、一个拐弯、两个拐弯。这部分需要详细说明,或者给出伪代码示例。另外,Android的界面刷新和性能优化也可能需要注意。 还要注意实验作业中常见的问题,比如图片资源的处理,如何随机生布局,游戏计时和得分系统,胜负判断等。可能还需要提到如何保存游戏状态,或者加入音效和动画效果,提升用户体验。 另外,用户可能希望了解参考资源,比如推荐一些教程、GitHub项目或者官方文档,帮助他们更好地完任务。同时,提醒他们在开发过程中注意测试,尤其是多点触摸和不同屏幕尺寸的适配问题。 最后,总结一下实现的大致步骤,从项目创建到界面设计,再到逻辑实现,最后测试优化。确保用户有一个清晰的思路,能够按部就班地完实验作业。</think>以下是关于Android Studio连连看实验作业的要点解析,分步骤说明实现思路: 1. **游戏规则核心** - 目标:消除所有相同图案 - 条件: 1. 两图案间路径最多2个拐点 2. 路径不可被其他图案阻挡 3. 消除后加分并刷新界面 2. **开发步骤分解** ```java // 伪代码示例:连通性检测核心算法 public boolean isConnectable(Point a, Point b) { // 直线连通检测 if (checkStraightLine(a, b)) return true; // 单拐点检测(L型路径) if (checkSingleCorner(a, b)) return true; // 双拐点检测(U型/Z型路径) return checkDoubleCorner(a, b); } ``` 3. **关键技术实现** - **界面布局**:推荐使用GridView+自定义Adapter - **数据结构**:二维数组存储棋盘状态 - **事件处理**: ```java gridView.setOnItemClickListener((parent, view, position, id) -> { if (firstSelected == null) { firstSelected = position; view.setBackgroundColor(Color.YELLOW); // 高亮选中效果 } else { if (checkMatch(firstSelected, position)) { removePairs(firstSelected, position); } clearSelection(); } }); ``` - **路径检测**:建议使用BFS算法或几何判断法 4. **常见问题解决方案** - **性能优化**:使用`invalidate()`局部刷新代替全局重绘 - **图案分布**:Fisher-Yates洗牌算法保证随机性 - **资源管理**:9-patch图片适配不同分辨率 5. **扩展功能建议** - 计时器功能: ```java new CountDownTimer(180000, 1000) { // 3分钟倒计时 public void onTick(long millisUntilFinished) { timerText.setText("剩余:" + millisUntilFinished/1000 + "秒"); } public void onFinish() { showGameOverDialog(); } }.start(); ``` - 音效系统:使用SoundPool实现点击/消除音效 - 存档功能:SharedPreferences保存最高分 6. **测试要点** - 边界测试:边缘图案消除验证 - 压力测试:连续快速点击处理 - 异常测试:无解局面自动洗牌 推荐学习资源: 1. Android官方View绘制文档 2. 《算法图解》路径查找章节 3. GitHub开源项目:https://github.com/android/... (可替换为具体项目链接) 开发时注意: - 使用ConstraintLayout保证多设备适配 - 最低API等级建议设置为21(覆盖90%以上设备) - 建议添加`android:configChanges="orientation"`处理屏幕旋转 建议开发流程: 1. 创建新项目 → 2. 设计游戏棋盘 → 3. 实现点击交互 → 4. 编写匹配算法 → 5. 添加计分系统 → 6. 进行多维度测试 这个实验能综合锻炼Android UI开发、事件处理和算法实现能力,完后可进一步拓展联网对战等高级功能。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值