hihoCoder 1040 矩阵判断

题目来源:矩阵判断

解题思路:

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)

  1 import java.util.ArrayList;
  2 import java.util.List;
  3 import java.util.Scanner;
  4
  5 public class Main {
  6
  7     public static boolean isCycled(List<Line> list) {
  8         List<Point> temp = new ArrayList<Point>();
  9         for (Line line : list) {
 10             if (line.getDistance() == 0)// 保证面积大于0
 11                 return false;
 12             if (temp.contains(line.start)) {
 13                 temp.remove(line.start);
 14             } else {
 15                 temp.add(line.start);
 16             }
 17             if (temp.contains(line.end)) {
 18                 temp.remove(line.end);
 19             } else {
 20                 temp.add(line.end);
 21             }
 22         }
 23         return temp.size() == 0;
 24     }
 25
 26     public static void main(String[] args) {
 27         Scanner scanner = new Scanner(System.in);
 28         int n = scanner.nextInt();
 29         List<Line> list = new ArrayList<Line>();
 30         for (int i = 0; i < n; i++) {
 31             list.clear();
 32             for (int j = 0; j < 4; j++) {
 33                 list.add(new Line(scanner.nextInt(), scanner.nextInt(), scanner
 34                         .nextInt(), scanner.nextInt()));
 35             }
 36             boolean ans = true;
 37             if (isCycled(list)) {
 38                 for (int j = 0; j < 4; j++) {
 39                     for (int k = j + 1; k < 4; k++) {
 40                         if (!list.get(j).isVerticalOrParallel(list.get(k))) {
 41                             ans = false;
 42                             break;
 43                         }
 44                     }
 45                     if (!ans)
 46                         break;
 47                 }
 48             } else {
 49                 ans = false;
 50             }
 51             if (ans) {
 52                 System.out.println("YES");
 53             } else {
 54                 System.out.println("NO");
 55             }
 56         }
 57     }
 58
 59 }
 60
 61 class Point {
 62     public int x;
 63     public int y;
 64
 65     public Point(int x, int y) {
 66         this.x = x;
 67         this.y = y;
 68     }
 69
 70     public boolean equals(Object o) {
 71         if (this == o)
 72             return true;
 73         if (o instanceof Point) {
 74             Point p = (Point) o;
 75             return this.x == p.x && this.y == p.y;
 76         }
 77         return false;
 78     }
 79
 80     public int hashCode() {
 81         return this.x * 10 + this.y;
 82     }
 83 }
 84
 85 class Line {
 86     public Point start;
 87     public Point end;
 88
 89     public Line(int x1, int y1, int x2, int y2) {
 90         this.start = new Point(x1, y1);
 91         this.end = new Point(x2, y2);
 92     }
 93
 94     private Point getVector() {
 95         return new Point(this.end.x - this.start.x, this.end.y - this.start.y);
 96     }
 97
 98     private boolean isVertical(Line line) {
 99         Point p1 = this.getVector();
100         Point p2 = line.getVector();
101         return p1.x * p2.x + p1.y * p2.y == 0;
102     }
103
104     private boolean isParallel(Line line) {
105         Point p1 = this.getVector();
106         Point p2 = line.getVector();
107         return p1.x * p2.y - p1.y * p2.x == 0;
108     }
109
110     public int getDistance() {
111         return (int) ((this.start.x - this.end.x) * (this.start.x - this.end.x) + (this.start.y - this.end.y)
112                 * (this.start.y - this.end.y));
113     }
114
115     public boolean isVerticalOrParallel(Line line) {
116         return this.isParallel(line) || this.isVertical(line);
117     }
118 }
时间: 2024-12-28 14:38:19

hihoCoder 1040 矩阵判断的相关文章

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

http://hihocoder.com/problemset/problem/1040 首先判断四条线段是否相交,给出八个点,如果有一些点重合,并且不同坐标的点只有4个的话,表示可以构成四边形. 然后判断每一条线段与其他线段树平行或者垂直,每一条线段都和其他线段平行或垂直的话就能构成矩形. 平行或相交可以用斜率计算,注意斜率不存在或者等于0的情况. 平行斜率相等,垂直的话斜率相乘等于-1,或者一个不存在一个为0. 1 #include<iostream> 2 #include<cstd

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

#1040 : 矩形判断 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 给出平面上4条线段,判断这4条线段是否恰好围成一个面积大于0的矩形. 输入 输入第一行是一个整数T(1<=T<=100),代表测试数据的数量. 每组数据包含4行,每行包含4个整数x1, y1, x2, y2 (0 <= x1, y1, x2, y2 <= 100000):其中(x1, y1), (x2,y2)代表一条线段的两个端点. 输出 每组数据输出一行YES或者NO,表示输入的

hihoCoder - 1040 - 矩形判断 (简单计算几何~)

#1040 : 矩形判断 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 给出平面上4条线段,判断这4条线段是否恰好围成一个面积大于0的矩形. 输入 输入第一行是一个整数T(1<=T<=100),代表测试数据的数量. 每组数据包含4行,每行包含4个整数x1, y1, x2, y2 (0 <= x1, y1, x2, y2 <= 100000):其中(x1, y1), (x2,y2)代表一条线段的两个端点. 输出 每组数据输出一行YES或者NO,表示输入的

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

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

hihocoder 1040(矩形判断)

题目链接:传送门 题目大意:给你四条线段,判断能否围成一个面积大于0的矩形,能输出YES,不能输出NO 题目思路:    合法的四条线段应该满足 1.应该必须有四个不同的点 2.线段斜率分为两组,组内相同组间不同 3.若有斜率为0或斜率不存在的线段需特判,否则看斜率不同的线段乘积==-1?"YES":"NO" #include <iostream> #include <cstdio> #include <cstdlib> #inc

HihoCoder - 1615矩阵游戏II

矩阵游戏II 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个NxN的整数矩阵,小Hi每次操作可以选择两列,将这两列中的所有数变成它的相反数. 小Hi可以进行任意次操作,他的目标是使矩阵中所有数的和尽量大.你能求出最大可能的和吗? 输入 第一行一个整数N. 以下N行,每行N个整数Aij. 对于30%的数据,2 ≤ N ≤ 10 对于100%的数据,2 ≤ N ≤ 200, -1000 ≤ Aij ≤ 1000 输出 最大可能的和 样例输入 4 -1 1 1

HihoCoder 1480:矩阵填数 (杨氏矩阵 || 钩子公式 + 筛逆元)

描述 小Hi在玩一个游戏,他需要把1, 2, 3, ... NM填入一个N行M列的矩阵中,使得矩阵每一行从左到右.每一列从上到下都是递增的. 例如如下是3x3的一种填法: 136 247 589 给定N和M,小Hi希望知道一共有多少种不同的填法. 输入 一行包含两个整数N和M. 对于60%的数据 1 <= N <= 2, 1 <= M <= 100000 对于20%的数据 N = 3, 1 <= M <= 100 对于100%的数据 1 <= N <= 3,

[hihoCoder]矩形判断

#1040 : 矩形判断 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 给出平面上4条线段,判断这4条线段是否恰好围成一个面积大于0的矩形. 输入 输入第一行是一个整数T(1<=T<=100),代表测试数据的数量. 每组数据包含4行,每行包含4个整数x1, y1, x2, y2 (0 <= x1, y1, x2, y2 <= 100000):其中(x1, y1), (x2,y2)代表一条线段的两个端点. 输出 每组数据输出一行YES或者NO,表示输入的

hihocoder 举行判断(计算几何)

判断是否为矩形,必须满足相异的4个点,存在4条边(不重合),边的向量只有两个,且两向量垂直: 满足这些条件就可以了 小知识点: 两个向量垂直(x1,y1),(x2,y2)   x1 * x2 + y1 * y2 == 0; 两个向量平行(x1,y2),(x2,y2)  x1 * y2 - x2 * y2 == 0; #1040 : 矩形判断 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 给出平面上4条线段,判断这4条线段是否恰好围成一个面积大于0的矩形. 输入 输入