<p>You are given an array of points in the <strong>X-Y</strong> plane <code>points</code> where <code>points[i] = [x<sub>i</sub>, y<sub>i</sub>]</code>.</p>

<p>Return <em>the minimum area of any rectangle formed from these points, with sides <strong>not necessarily parallel</strong> to the X and Y axes</em>. If there is not any such rectangle, return <code>0</code>.</p>

<p>Answers within <code>10<sup>-5</sup></code> of the actual answer will be accepted.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2018/12/21/1a.png" style="width: 398px; height: 400px;" />
<pre>
<strong>Input:</strong> points = [[1,2],[2,1],[1,0],[0,1]]
<strong>Output:</strong> 2.00000
<strong>Explanation:</strong> The minimum area rectangle occurs at [1,2],[2,1],[1,0],[0,1], with an area of 2.
</pre>

<p><strong class="example">Example 2:</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2018/12/22/2.png" style="width: 400px; height: 251px;" />
<pre>
<strong>Input:</strong> points = [[0,1],[2,1],[1,1],[1,0],[2,0]]
<strong>Output:</strong> 1.00000
<strong>Explanation:</strong> The minimum area rectangle occurs at [1,0],[1,1],[2,1],[2,0], with an area of 1.
</pre>

<p><strong class="example">Example 3:</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2018/12/22/3.png" style="width: 383px; height: 400px;" />
<pre>
<strong>Input:</strong> points = [[0,3],[1,2],[3,1],[1,3],[2,1]]
<strong>Output:</strong> 0
<strong>Explanation:</strong> There is no possible rectangle to form from these points.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= points.length &lt;= 50</code></li>
	<li><code>points[i].length == 2</code></li>
	<li><code>0 &lt;= x<sub>i</sub>, y<sub>i</sub> &lt;= 4 * 10<sup>4</sup></code></li>
	<li>All the given points are <strong>unique</strong>.</li>
</ul>

class Solution {
public:
    double minAreaFreeRect(vector<vector<int>>& points) {
        set<vector<int>> st(points.begin(), points.end());
        double ans = LONG_MAX;

        for(int i=0;i<points.size();i++){
            for(int j=i+1;j<points.size();j++){
                for(int z=j+1;z<points.size();z++){
                    long long int d1 = pow((points[i][0]-points[j][0]), 2) + pow((points[i][1]-points[j][1]), 2);
                    long long int d2 = pow((points[z][0]-points[j][0]), 2) + pow((points[z][1]-points[j][1]), 2);
                    long long int d3 = pow((points[i][0]-points[z][0]), 2) + pow((points[i][1]-points[z][1]), 2);

                    long long arr[3] = {d1, d2, d3};
                    sort(arr, arr+3);

                    if(arr[2] == arr[0]+arr[1]){
                        int new_x, new_y;
                        double area;
                        if(arr[2] == d1){
                            vector<int> right_vertex = points[z];
                            new_x = points[i][0]+points[j][0]-points[z][0];
                            new_y = points[i][1]+points[j][1]-points[z][1];
                            area = sqrtl(d2) * sqrtl(d3);
                        }
                        else if(arr[2] == d2){
                            vector<int> right_vertex = points[i];
                            new_x = points[z][0]+points[j][0]-points[i][0];
                            new_y = points[z][1]+points[j][1]-points[i][1];
                            area = sqrtl(d1) * sqrtl(d3);
                        }
                        else{
                            vector<int> right_vertex = points[j];
                            new_x = points[i][0]+points[z][0]-points[j][0];
                            new_y = points[i][1]+points[z][1]-points[j][1];
                            area = sqrtl(d1) * sqrtl(d2);
                        }

                        if(st.find({new_x, new_y})!= st.end()){
                            ans = min(ans, area);
                        }
                    }

                }
            }
        }
        if(ans == LONG_MAX)ans=0;
        return ans;
    }
};
13353