結果

問題 No.2867 NOT FOUND 404 Again
ユーザー Thania Montana
提出日時 2025-08-12 15:10:50
言語 Java
(openjdk 23)
結果
RE  
実行時間 -
コード長 3,249 bytes
コンパイル時間 3,371 ms
コンパイル使用メモリ 80,180 KB
実行使用メモリ 51,044 KB
最終ジャッジ日時 2025-08-12 15:12:48
合計ジャッジ時間 7,509 ms
ジャッジサーバーID
(参考情報)
judge4 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample RE * 2
other RE * 18
権限があれば一括ダウンロードができます

ソースコード

diff #

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

    static class Point {
        long x, y;

        Point(long x, long y) {
            this.x = x;
            this.y = y;
        }
    }

    // 计算两点之间距离的平方
    private static long distSq(Point p1, Point p2) {
        return (p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y);
    }

    // 检查三点是否共线
    // 使用叉积原理避免除法和浮点数:(y2-y1)*(x3-x2) == (y3-y2)*(x2-x1)
    private static boolean areCollinear(Point p1, Point p2, Point p3) {
        return (p2.y - p1.y) * (p3.x - p2.x) == (p3.y - p2.y) * (p2.x - p1.x);
    }

    public static void solve() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        while (T-- > 0) {
            StringTokenizer stA = new StringTokenizer(br.readLine());
            Point a = new Point(Long.parseLong(stA.nextToken()), Long.parseLong(stA.nextToken()));

            StringTokenizer stB = new StringTokenizer(br.readLine());
            Point b = new Point(Long.parseLong(stB.nextToken()), Long.parseLong(stB.nextToken()));

            StringTokenizer stC = new StringTokenizer(br.readLine());
            Point c = new Point(Long.parseLong(stC.nextToken()), Long.parseLong(stC.nextToken()));

            StringTokenizer stD = new StringTokenizer(br.readLine());
            Point d = new Point(Long.parseLong(stD.nextToken()), Long.parseLong(stD.nextToken()));

            // 1. 退化检查:任意三点共线则不是有效四边形
            // 这个检查也包含了任意两点重合的情况
            if (areCollinear(a, b, c) || areCollinear(b, c, d) || areCollinear(c, d, a) || areCollinear(d, a, b)) {
                System.out.println("NONE");
                continue;
            }

            // 2. 平行四边形判定:对角线中点是否重合
            // (a.x + c.x)/2 == (b.x + d.x)/2  => a.x + c.x == b.x + d.x
            // (a.y + c.y)/2 == (b.y + d.y)/2  => a.y + c.y == b.y + d.y
            boolean isParallelogram = (a.x + c.x == b.x + d.x) && (a.y + c.y == b.y + d.y);

            if (isParallelogram) {
                long dAB2 = distSq(a, b);
                long dBC2 = distSq(b, c);
                long dAC2 = distSq(a, c);
                long dBD2 = distSq(b, d);

                boolean adjacentSidesEqual = (dAB2 == dBC2); // 菱形特性
                boolean diagonalsEqual = (dAC2 == dBD2);     // 矩形特性

                if (adjacentSidesEqual && diagonalsEqual) {
                    System.out.println("SQUARE");
                } else if (adjacentSidesEqual) {
                    System.out.println("RHOMBUS");
                } else if (diagonalsEqual) {
                    System.out.println("RECTANGLE");
                } else {
                    System.out.println("PARALLELOGRAM");
                }
            } else {
                System.out.println("QUADRILATERAL");
            }
        }
    }

    public static void main(String[] args) throws IOException {
        solve();
    }
}
0