题目来源:矩阵判断

解题思路:

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. 这一次搞懂Spring事务注解的解析

    前言 事务我们都知道是什么,而Spring事务就是在数据库之上利用AOP提供声明式事务和编程式事务帮助我们简化开发,解耦业务逻辑和系统逻辑.但是Spring事务原理是怎样?事务在方法间是如何传播的?为 ...

  2. Anaconda 安装tensorflow出现错误

    C:\ProgramData\Anaconda3\envs\python36tfgpu\lib\site-packages\tensorflow\python\framework\dtypes.py: ...

  3. Windows 程序设计(4) MFC-02 基本控件-上

    1. Button 按钮控件 1.1.按钮控件的基本使用 新建对话框工程,拖拽按钮控件,添加点击事件响应函数! a.双击模版进行添加: b.事件方式进行添加: button的常见事件类型 void C ...

  4. cb09a_c++_顺序容器的操作2-在顺序容器中添加元素_插入数据

    cb09a_c++_顺序容器的操作2在顺序容器中添加元素vector不能向前插入数据,list可以用insertc.push_back(t);c.push_front(t);c.insert(p,t) ...

  5. docker已运行容器里的时区修改

    ln -sf /usr/share/zoneinfo/Asia/Shanghai    /etc/localtime 或者 cp /usr/share/zoneinfo/Asia/Shanghai  ...

  6. CSV文件导入到数据库中读取数据详解(接着上个帖子)

    一.controller层 二.SERVICE层 @Overridepublic Result importJinjiangAssessResult(MultipartFile file) throw ...

  7. Python3-socket模块-低级网络接口

    Python3中的socket模块提供了对访问套接字(socket)的接口 socket可以理解为是一个管道,通过这个管道可以使两个不同的程序通过网络进行通信,在Python中的scoket()函数可 ...

  8. pikachu靶场-XSS

    .Tips: 一般查询接口容易出现反射型XSS,留言板容易出现存储型XSS 由于后台可能存在过滤措施,构造的script可能会被过滤掉,而无法生效,或者环境限制了执行(浏览器): 通过变化不同的scr ...

  9. Nginx之upstream的四种配置方式

    1.轮询(weight)   指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况.默认当weight不指定时,各服务器weight相同,每个请求按时间顺序逐一分配到不同的后端服务 ...

  10. JavaScript图形实例:递归生成树

    观察自然界中树的分叉,一根主干生长出两个侧干,每个侧干又长出两个侧干,以此类推,便生长出疏密有致的结构.这样的生长结构,使用递归算法可以模拟出来. 例如,分叉的侧干按45°的偏转角度进行生长的递归示意 ...