C#学习笔记:矩形判断

#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,表示输入的4条线段是否恰好围成矩形。

样例输入
3
0 0 0 1
1 0 1 1
0 1 1 1
1 0 0 0
0 1 2 3
1 0 3 2
3 2 2 3
1 0 0 1
0 1 1 0
1 0 2 0
2 0 1 1
1 1 0 1
样例输出
YES
YES
NO
参见:hihoCoder矩形判断


根据对角线互相平分且相等的四边形即是正方形这一判断方法,首先判断输入的四条边能连接成一个四边形,然后判断对角线是否平分且相等。代码如下:

using System;

namespace Orthogon
{
    class Program
    {
        const int N = 4;
        static void Main()
        {
            int T = int.Parse(Console.ReadLine());
            while (T-- > 0)
            {
                string[] inputs = new string[N];
                for (int i = 0; i < N; i++)
                {
                    inputs[i] = Console.ReadLine();
                }
                Console.WriteLine(IsOrthogon(inputs));
            }
        }
        static string IsOrthogon(string[] lines)
        {
            string result = "NO";
            int[,] points = new int[2, 4];
            int[,] sides = new int[4, 4];
            for (int i = 0; i < points.GetLength(0); i++)
            {
                for (int j = 0; j < points.GetLength(1); j++)
                {
                    points[i, j] = -1;
                }
            }
            for (int i = 0; i < lines.Length; i++)
            {
                string[] tokens = lines[i].Split(' ');
                for (int j = 0; j < tokens.Length; j += 2)
                {
                    int x = int.Parse(tokens[j]);
                    int y = int.Parse(tokens[j + 1]);
                    sides[j, i] = x;
                    sides[j + 1, i] = y;
                    bool done = true;
                    for (int k = 0; k < points.GetLength(1); k++)
                    {
                        if (points[0, k] == -1 && points[1, k] == -1)
                        {
                            points[0, k] = x;
                            points[1, k] = y;
                            done = false;
                            break;
                        }
                        else if (points[0, k] == x && points[1, k] == y)
                        {
                            done = false;
                            break;
                        }
                    }
                    if (done) return result;
                }
            }
            int pax = points[0, 0];
            int pay = points[1, 0];
            int pbx, pby, pcx, pcy, pdx, pdy;
            pbx = pby = pcx = pcy = pdx = pdy = -1;
            for (int i = 0; i < sides.GetLength(1); i++)
            {
                if (sides[0, i] == pax && sides[1, i] == pay)
                {
                    pbx = sides[2, i];
                    pby = sides[3, i];
                }
                else if (sides[2, i] == pax && sides[3, i] == pay)
                {
                    pcx = sides[0, i];
                    pcy = sides[1, i];
                }
            }
            for (int i = 0; i < sides.GetLength(1); i++)
            {
                int xid, yid;
                xid = yid = -1;
                if (sides[0, i] == pbx && sides[1, i] == pby)
                {
                    xid = sides[2, i];
                    yid = sides[3, i];
                }
                else if (sides[2, i] == pbx && sides[3, i] == pby)
                {
                    xid = sides[0, i];
                    yid = sides[1, i];
                }
                if (xid != -1 && xid != pax && yid != pay)
                {
                    pdx = xid;
                    pdy = yid;
                }
            }
            if (pax + pdx == pbx + pcx && pay + pdy == pby + pcy)
            {
                int ladx = pax - pdx;
                int lady = pay - pdy;
                int lbcx = pbx - pcx;
                int lbcy = pby - pcy;
                ladx *= ladx;
                lady *= lady;
                lbcx *= lbcx;
                lbcy *= lbcy;
                if (ladx + lady == lbcx + lbcy)
                {
                    result = "YES";
                }
            }
            return result;
        }
    }
}


你可能感兴趣的:(C#)