Find Four points such that they form a square whose sides are parallel to x and y axes

Given ‘n’ pair of points, the task is to find four points such that they form a square whose sides are parallel to x and y axes or print “No such square” otherwise.
If more than one square is possible then choose the one with the maximum area.

Examples:

Input : n = 6, points = (1, 1), (4, 4), (3, 4), (4, 3), (1, 4), (4, 1)
Output :
side of the square is : 3, points of the square are 1, 1 4, 1 1, 4 4, 4
Explanation: The points 1, 1 4, 1 1, 4 4, 4 form a square of side 3

Input :n= 6, points= (1, 1), (4, 5), (3, 4), (4, 3), (7, 4), (3, 1)
Output :No such square

Simple approach: Choose all possible pairs of points with four nested loops and then see if the points form a square which is parallel to principal axes. If yes then check if it is the largest square so far in terms of the area and store the result, and then display the result at the end of the program.
Time Complexity: O(N^4)

Efficient Approach: Create a nested loop for top right and bottom left corner of the square and form a square with those two points, then check if the other two points which were assumed actually exist. To check if a point exists or not, create a map and store the points in the map to reduce the time to check whether the points exist. Also, keep in check the largest square by area so far and print it in the end.

Below is the implementation of the above approach:

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implemenataion of the above approach
#include <bits/stdc++.h>
using namespace std;
  
// find the largest square
void findLargestSquare(long long int points[][2], int n)
{
    // map to store which points exist
    map<pair<long long int, long long int>, int> m;
  
    // mark the available points
    for (int i = 0; i < n; i++) {
        m[make_pair(points[i][0], points[i][1])]++;
    }
    long long int side = -1, x = -1, y = -1;
  
    // a nested loop to choose the opposite corners of square
    for (int i = 0; i < n; i++) {
  
        // remove the chosen point
        m[make_pair(points[i][0], points[i][1])]--;
        for (int j = 0; j < n; j++) {
  
            // remove the chosen point
            m[make_pair(points[j][0], points[j][1])]--;
  
            // check if the other two points exist
            if (i != j 
                  && (points[i][0]-points[j][0]) == (points[i][1]-points[j][1])){
                if (m[make_pair(points[i][0], points[j][1])] > 0
                     && m[make_pair(points[j][0], points[i][1])] > 0) {
  
                    // if the square is largest then store it
                    if (side < abs(points[i][0] - points[j][0]) 
                         || (side == abs(points[i][0] - points[j][0]) 
                            && ((points[i][0] * points[i][0] 
                                   + points[i][1] * points[i][1]) 
                                      < (x * x + y * y)))) {
                        x = points[i][0];
                        y = points[i][1];
                        side = abs(points[i][0] - points[j][0]);
                    }
                }
            }
  
            // add the removed point
            m[make_pair(points[j][0], points[j][1])]++;
        }
  
        // add the removed point
        m[make_pair(points[i][0], points[i][1])]++;
    }
  
    // display the largest square
    if (side != -1)
        cout << "Side of the square is : " << side
             << ", \npoints of the square are " << x << ", " << y
             << " "
             << (x + side) << ", " << y
             << " "
             << (x) << ", " << (y + side)
             << " "
             << (x + side) << ", " << (y + side) << endl;
    else
        cout << "No such square" << endl;
}
  
//Driver code
int main()
{
    int n = 6;
  
    // given points
    long long int points[n][2]
      = { { 1, 1 }, { 4, 4 }, { 3, 4 }, { 4, 3 }, { 1, 4 }, { 4, 1 } };
  
    // find the largest square
    findLargestSquare(points, n);
  
    return 0;
}

chevron_right


Output:

Side of the square is : 3, 
points of the square are 1, 1 4, 1 1, 4 4, 4

Time Complexity: O(N^2)



My Personal Notes arrow_drop_up

Second year Department of Information Technology Jadavpur University

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.