题目来源:矩阵判断

解题思路:

1、判断矩阵的4个点是否相连,一共输入8个点,只要判断是否4个点是否都经过2遍;

2、判断矩阵中任意一条边与其他边之间要么平行,要么垂直。设A(x1,y1),B(x2,y2),C(x3,y3),D(x4,y4),则线段AB的向量为A’(x2-x1,y2-y1),线段CD的向量C'(x4-x3,y4-y3),另x2-x1=a1,y2-y1=a2,x4-x3=c1,y4-y3=c2,判断A’是否平行C'的方法是a1*c2-a2*c1=0;判断A’是否垂直C'的方法是a1*c1+a2*c2=0.

具体算法(java版,可以直接AC)

 import java.util.ArrayList;
import java.util.List;
import java.util.Scanner; public class Main { public static boolean isCycled(List<Line> list) {
List<Point> temp = new ArrayList<Point>();
for (Line line : list) {
if (line.getDistance() == 0)// 保证面积大于0
return false;
if (temp.contains(line.start)) {
temp.remove(line.start);
} else {
temp.add(line.start);
}
if (temp.contains(line.end)) {
temp.remove(line.end);
} else {
temp.add(line.end);
}
}
return temp.size() == 0;
} public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
List<Line> list = new ArrayList<Line>();
for (int i = 0; i < n; i++) {
list.clear();
for (int j = 0; j < 4; j++) {
list.add(new Line(scanner.nextInt(), scanner.nextInt(), scanner
.nextInt(), scanner.nextInt()));
}
boolean ans = true;
if (isCycled(list)) {
for (int j = 0; j < 4; j++) {
for (int k = j + 1; k < 4; k++) {
if (!list.get(j).isVerticalOrParallel(list.get(k))) {
ans = false;
break;
}
}
if (!ans)
break;
}
} else {
ans = false;
}
if (ans) {
System.out.println("YES");
} else {
System.out.println("NO");
}
}
} } class Point {
public int x;
public int y; public Point(int x, int y) {
this.x = x;
this.y = y;
} public boolean equals(Object o) {
if (this == o)
return true;
if (o instanceof Point) {
Point p = (Point) o;
return this.x == p.x && this.y == p.y;
}
return false;
} public int hashCode() {
return this.x * 10 + this.y;
}
} class Line {
public Point start;
public Point end; public Line(int x1, int y1, int x2, int y2) {
this.start = new Point(x1, y1);
this.end = new Point(x2, y2);
} private Point getVector() {
return new Point(this.end.x - this.start.x, this.end.y - this.start.y);
} private boolean isVertical(Line line) {
Point p1 = this.getVector();
Point p2 = line.getVector();
return p1.x * p2.x + p1.y * p2.y == 0;
} private boolean isParallel(Line line) {
Point p1 = this.getVector();
Point p2 = line.getVector();
return p1.x * p2.y - p1.y * p2.x == 0;
} public int getDistance() {
return (int) ((this.start.x - this.end.x) * (this.start.x - this.end.x) + (this.start.y - this.end.y)
* (this.start.y - this.end.y));
} public boolean isVerticalOrParallel(Line line) {
return this.isParallel(line) || this.isVertical(line);
}
}

hihoCoder 1040 矩阵判断 最详细的解题报告的更多相关文章

  1. hihoCoder 1041 国庆出游 最详细的解题报告

    题目来源:国庆出游 解题思路(下面是大神的写的): 把题目中的序列称作S,树称作T.那么对于S中的任意节点x,x的子孙节点如果在S出现的话,那么这个子孙节点的位置是有一定要求的:x的所有子孙节点在S中 ...

  2. hihoCoder 1037 数字三角形 最详细的解题报告

    题目来源:hihoCoder 1037 数字三角形 解题思路:请好好看看 提示一.提示二.提示三 具体算法(java版,可以直接AC) import java.util.Scanner; public ...

  3. hihoCoder 1039 字符消除 最详细的解题报告

    题目来源:字符消除 解题思路: 1.在给定字符串中的任意位置插入'A'.'B'.'C'中的任意一个字符,然后计算插入后的字符经过消除后最短的字符串长度: 2.在计算字符消除后最短长度时,智能一遍一遍的 ...

  4. hihoCoder 1040 矩形判断(计算几何)

    http://hihocoder.com/problemset/problem/1040 首先判断四条线段是否相交,给出八个点,如果有一些点重合,并且不同坐标的点只有4个的话,表示可以构成四边形. 然 ...

  5. hihocoder #1040 矩形判断(计算几何问题 给8个点的坐标,能否成为一个矩形 【模板思路】)

    #1040 : 矩形判断 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 给出平面上4条线段,判断这4条线段是否恰好围成一个面积大于0的矩形. 输入 输入第一行是一个整数T ...

  6. hihoCoder #1040 (判断是否为矩形)

    题目大意:给四条线段,问能否构成一个矩形? 题目分析:先判断能否构成四边形,然后选一条边,看另外三条边中是否为一条与他平行,两条垂直. 代码如下: # include<iostream> ...

  7. HihoCoder - 1040 矩形判断

    矩形判断 给出平面上4条线段,判断这4条线段是否恰好围成一个面积大于0的矩形. Input 输入第一行是一个整数T(1<=T<=100),代表测试数据的数量. 每组数据包含4行,每行包含4 ...

  8. hihoCoder 1114 小Hi小Ho的惊天大作战:扫雷·一 最详细的解题报告

    题目来源:小Hi小Ho的惊天大作战:扫雷·一 解题思路:因为只要确定了第一个是否有地雷就可以推算出后面是否有地雷(要么为0,要么为1,如果不是这两个值就说明这个方案行不通),如果两种可能中有一种成功, ...

  9. hihoCoder 1050 树中的最长路 最详细的解题报告

    题目来源:树中的最长路 解题思路:枚举每一个点作为转折点t,求出以t为根节点的子树中的‘最长路’以及与‘最长路’不重合的‘次长路’,用这两条路的长度之和去更新答案,最终的答案就是这棵树的最长路长度.只 ...

随机推荐

  1. TensorFlow从0到1之TensorFlow实现多元线性回归(16)

    在 TensorFlow 实现简单线性回归的基础上,可通过在权重和占位符的声明中稍作修改来对相同的数据进行多元线性回归. 在多元线性回归的情况下,由于每个特征具有不同的值范围,归一化变得至关重要.这里 ...

  2. Linux服务器安装python3.6

    CentOS 7上默认安装的python版本是2.7.5,系统自带的旧版本python被系统很多其他软件环境依赖,因此不能卸载原Python,直接选择Python3.6.5进行全新安装. 1 安装Py ...

  3. 让人又爱又恨的Lombok,到底该不该用

    1 简介 Lombok,印尼的一个岛屿,龙目岛.但在Java的世界里,它是一个方便的类库,能提供很多便利,因此得到许多人的青睐.但也有不少反对声音.这是为什么呢? 之前去龙目岛拍的日落. 2 Lomb ...

  4. cb40a_c++_STL_算法_交换swap_ranges

    cb40a_c++_STL_算法_交换swap_rangesswap_ranges(b,e,b2);如果两个容器的数据数量不一致时,只交换一部分数据,a里面3个,b里面5个,则只会交换3个,b里面还有 ...

  5. Linux 安装指定jdk版本

    操作步骤 卸载系统自带jdk版本 1.查看安装的jdk rpm -qa | grep java 2.卸载系统自带jdk rpm -e --nodeps 包名 下载jdk 当前最新版本下载地址:http ...

  6. Beta冲刺<3/10>

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺--第三天(05.21) 作业正文 如下 其他参考文献 ... B ...

  7. 一个JS库Lodash

    中文文档:https://www.html.cn/doc/lodash/#_aftern-func

  8. MySQL新密码机制介绍caching_sha2_password

    MySQL添加了对身份验证插件的支持,该插件现在称为mysql_native_password.该mysql_native_password插件使用SHA1哈希 将密码(SHA1(SHA1(passw ...

  9. mybatis源码配置文件解析之五:解析mappers标签(解析XML映射文件)

    在上篇文章中分析了mybatis解析<mappers>标签,<mybatis源码配置文件解析之五:解析mappers标签>重点分析了如何解析<mappers>标签中 ...

  10. 栈的顺序存储和链式存储c语言实现

    一. 栈 栈的定义:栈是只允许在一端进行插入或删除操作的线性表. 1.栈的顺序存储 栈顶指针:S.top,初始设为-1 栈顶元素:S.data[S.top] 进栈操作:栈不满时,栈顶指针先加1,再到栈 ...