using System.Collections.Generic;
public static void Main()
int[][] rectangles1 = new int[][] {new int[]{1,1,3,3}, new int[]{3,1,4,2}, new int[]{3,2,4,4}, new int[]{1,3,2,4}, new int[]{2,3,3,4}};
Console.WriteLine(PerfectRectangle.IsRectangle(rectangles1));
int[][] rectangles2 = new int[][]{new int[]{1,1,2,3}, new int[]{1,3,2,4}, new int[]{3,1,4,2}, new int[]{3,2,4,4}};
Console.WriteLine(PerfectRectangle.IsRectangle(rectangles2));
int[][] rectangles3 = new int[][]{new int[]{1,1,3,3}, new int[]{3,1,4,2}, new int[]{1,3,2,4}, new int[]{3,2,4,4}};
Console.WriteLine(PerfectRectangle.IsRectangle(rectangles3));
int[][] rectangles4 = new int[][]{new int[]{1,1,3,3}, new int[]{3,1,4,2}, new int[]{1,3,2,4}, new int[]{2,2,4,4}};
Console.WriteLine(PerfectRectangle.IsRectangle(rectangles4));
int[][] rectangles5 = new int[][]{new int[]{1,1,3,3}, new int[]{3,1,4,2}, new int[]{1,3,2,4}, new int[]{3,2,4,4}, new int[]{2,3,3,4}};
Console.WriteLine(PerfectRectangle.IsRectangle(rectangles5));
public static class PerfectRectangle
public static bool IsRectangle(int[][] rectArray)
int maxX=0,minX=0,maxY=0,minY = 0;
if(rectArray.Length == 0)
List<Point> listOfPoints = new List<Point>();
foreach(int[] rect in rectArray)
listOfPoints = CheckAllCornersOfRectangleInPointList(listOfPoints, rect);
totalArea += GetArea(rect[0], rect[2], rect[1], rect[3]);
minX = (minX > rect[0])? rect[0] : minX;
minX = (minX > rect[2])? rect[2] : minX;
maxX = (maxX < rect[0])? rect[0] : maxX;
maxX = (maxX < rect[2])? rect[2] : maxX;
minY = (minY > rect[1])? rect[1] : minY;
minY = (minY > rect[3])? rect[3] : minY;
maxY = (maxY < rect[1])? rect[1] : maxY;
maxY = (maxY < rect[3])? rect[3] : maxY;
if(listOfPoints.Count() > 4 || totalArea != GetArea(minX,maxX,minY,maxY))
private static List<Point> CheckAllCornersOfRectangleInPointList(List<Point> pointList, int[] rectangle)
pointList = CheckPointExistsInList(pointList , rectangle[0], rectangle[1]);
pointList = CheckPointExistsInList(pointList , rectangle[0], rectangle[3]);
pointList = CheckPointExistsInList(pointList , rectangle[2], rectangle[1]);
pointList = CheckPointExistsInList(pointList , rectangle[2], rectangle[3]);
private static List<Point> CheckPointExistsInList(List<Point> pointList, int x, int y)
if(pointList.Any(a => a.X == x && a.Y == y))
pointList.RemoveAll(b => b.X == x && b.Y == y);
pointList.Add(new Point(x,y));
private static int GetArea(int x2, int x1, int y2, int y1)
return (Math.Abs(y2-y2)* Math.Abs(x2-x1));
public Point(int x, int y)