Program 360: Print all possible squares from given N Co-ordinates
//Coming Soon
Output:
#include<stdio.h> struct Vertex { int x, y; }; void CombiPossible(int arr[], int data[], int start, int end,int index, int r,int allCombinations[]); int CheckSquare(Vertex p1, Vertex p2, Vertex p3, Vertex p4); int DistVetrices(Vertex p, Vertex q); int GetNcR(int n,int r); int factorial(int num); int main() { int chkSquare,i,n,j,k,temp,r=4,l,count=0; char c; printf("Enter number of vertices\n"); scanf("%d",&n); Vertex p[n]; int arr[n]; for(i=0;i<n;i++) { printf("Enter Vertices of %d in (x y) form\n",i); scanf("%d%c%d",&p[i].x,&c,&p[i].y); arr[i]=i; } int data[r]; int ncr=GetNcR(n,r); int allCombinations[ncr*4]; CombiPossible(arr,data, 0,n-1,0,r,allCombinations); for(i=0;i<ncr*4;i+=4) { //printf("%d--->%d,%d,%d,%d\n",i,allCombinations[i],allCombinations[i+1],allCombinations[i+2],allCombinations[i+3]); int num[4]={allCombinations[i],allCombinations[i+1],allCombinations[i+2],allCombinations[i+3]}; chkSquare=CheckSquare(p[num[0]], p[num[1]], p[num[2]], p[num[3]]); if(chkSquare==1) { for(l=0;l<=r-1;l++) printf("(%d,%d), ",p[num[l]].x,p[num[l]].y); count++; printf("\n"); } } printf("Total Squares Possibility=%d\n",count); return 0; } int CheckSquare(Vertex p1, Vertex p2, Vertex p3, Vertex p4) { int d2 = DistVetrices(p1, p2); int d3 = DistVetrices(p1, p3); int d4 = DistVetrices(p1, p4); if (d2 == d3 && 2*d2 == d4) { int flag=0; int d = DistVetrices(p2, p4); if(d == DistVetrices(p3, p4) && d == d2){ flag=1; } return (flag); } if (d3 == d4 && 2*d3 == d2) { int flag=0; int d = DistVetrices(p2, p3); if(d == DistVetrices(p2, p4) && d == d3) flag=1; return (flag); } if (d2 == d4 && 2*d2 == d3) { int flag=0; int d = DistVetrices(p2, p3); if(d == DistVetrices(p3, p4) && d == d2) flag=1; return (flag); } return (0); } int DistVetrices(Vertex p, Vertex q) { return (p.x - q.x)*(p.x - q.x) + (p.y - q.y)*(p.y - q.y); } void CombiPossible(int arr[], int data[], int start, int end,int index, int r,int allCombinations[]) { static int x=0; if (index == r) { for (int j=0; j<r; j++) { allCombinations[x++]=data[j]; } return; } for (int i=start; i<=end && end-i+1 >= r-index; i++) { data[index] = arr[i]; CombiPossible(arr, data, i+1, end, index+1, r,allCombinations); } } int GetNcR(int n,int r) { return ((float)factorial(n)/(factorial(r)*factorial(n-r))); } int factorial(int num) { int i,fact=1; for(i=1;i<=num;i++) { fact=fact*i; } return(fact); }Explanation:
//Coming Soon
Output: