题目来源:矩阵判断

解题思路:

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. @atcoder - AGC002E@ Candy Piles

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定 N 堆糖果,第 i 堆包含 ai 个糖果. 现在两人进行博 ...

  2. 【JMeter_15】JMeter逻辑控制器__仅一次控制器<Once Only Controller>

    仅一次控制器<Once Only Controller> 业务逻辑: 在每个线程内,该控制器下的内容只会被执行一遍,无论循环多少次,都只执行一遍.<嵌套在循环控制器之内时是个例外,每 ...

  3. DNS bind使用

    概念介绍 DNS的分类 主DNS:配置管理,不提供服务,只用来编辑配置信息,给从DNS提供同步数据 从DNS:从主DNS上同步数据信息,对外提供服务 缓存DNS:在主DNS和从DNS之间,用来递归解析 ...

  4. JMETER学习宝典

    1. 简介 Apache JMeter是100%纯java桌面应用程序,被设计用来测试客户端/服务器结构的软件(例如web应用程序).它可以用来测试包括基于静态和动态资源程序的性能,例如静态文件,Ja ...

  5. 010.OpenShift综合实验及应用

    实验一 安装OpenShift 1.1 前置准备 [student@workstation ~]$ lab review-install setup 1.2 配置规划 OpenShift集群有三个节点 ...

  6. Python实用笔记 (12)函数式编程——高阶函数

    函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数! Python对函数式编程提供部分支持.由于Python允许使用变量,因此,Python不是纯函数式编程语言. 变量 ...

  7. .NET Core 选项模式【Options】的使用

    ASP.NET Core引入了Options模式,使用类来表示相关的设置组.简单的来说,就是用强类型的类来表达配置项,这带来了很多好处.利用了系统的依赖注入,并且还可以利用配置系统.它使我们可以采用依 ...

  8. js进度条

    第一步//====================.wrap,.circle,.percent{                  position: absolute;                ...

  9. 面向切面对象AOP

    前言 面向切面编程(思想)AOP Aspect Oriented  Programming,是面向对象基础上 更关注最终目标 而不关注中间的小目标,简而言之,就是我们的目标(例如constroller ...

  10. java语言进阶(七)_Lambda表达式

    1 函数式编程思想概述 在数学中,函数就是有输入量.输出量的一套计算方案,也就是"拿什么东西做什么事情".相对而言,面向对象过分强调"必须通过对象的形式来做事情" ...