Bir düzlem üzerinde birbirinden farklı bazı noktalar verildiğinde bunların üçü aynı doğru üzerinde yer almıyor. Köşeleri verilen noktalar olan Paralelkenarların sayısını bulmamız gerekiyor. Örnekler:
Input : points[] = {(0 0) (0 2) (2 2) (4 2) (1 4) (3 4)} Output : 2 Two Parallelograms are possible by choosing above given point as vertices which are shown in below diagram. Bu sorunu, paralelkenarın köşegenlerinin ortada kesiştiği özel bir paralelkenar özelliğini kullanarak çözebiliriz. Dolayısıyla, birden fazla doğru parçasının orta noktası olan böyle bir orta nokta elde edersek, bir paralelkenarın daha doğru olduğu sonucuna varabiliriz, eğer bir orta nokta x kez meydana gelirse, olası paralelkenarların köşegenleri seçilebilir.XC2yani x frekansına sahip bu orta noktaya karşılık gelen x*(x-1)/2 paralelkenarları olacaktır. Böylece tüm nokta çiftleri üzerinde yineleme yapıyoruz ve orta noktalarını hesaplıyoruz ve orta noktanın frekansını 1 artırıyoruz. Sonunda yukarıda açıklandığı gibi her bir orta noktanın frekansına göre paralelkenar sayısını sayıyoruz. Sadece orta noktanın frekansının 2'ye bölünmesine ihtiyacımız olduğundan, basitlik açısından orta nokta hesaplanırken göz ardı edilir.
CPP// C++ program to get number of Parallelograms we // can make by given points of the plane #include using namespace std; // Returns count of Parallelograms possible // from given points int countOfParallelograms(int x[] int y[] int N) { // Map to store frequency of mid points map<pair<int int> int> cnt; for (int i=0; i<N; i++) { for (int j=i+1; j<N; j++) { // division by 2 is ignored to get // rid of doubles int midX = x[i] + x[j]; int midY = y[i] + y[j]; // increase the frequency of mid point cnt[make_pair(midX midY)]++; } } // Iterating through all mid points int res = 0; for (auto it = cnt.begin(); it != cnt.end(); it++) { int freq = it->second; // Increase the count of Parallelograms by // applying function on frequency of mid point res += freq*(freq - 1)/2; } return res; } // Driver code to test above methods int main() { int x[] = {0 0 2 4 1 3}; int y[] = {0 2 2 2 4 4}; int N = sizeof(x) / sizeof(int); cout << countOfParallelograms(x y N) << endl; return 0; }
Java /*package whatever //do not write package name here */ import java.io.*; import java.util.*; public class GFG { // Returns count of Parallelograms possible // from given points public static int countOfParallelograms(int[] x int[] y int N) { // Map to store frequency of mid points HashMap<String Integer> cnt = new HashMap<>(); for (int i=0; i<N; i++) { for (int j=i+1; j<N; j++) { // division by 2 is ignored to get // rid of doubles int midX = x[i] + x[j]; int midY = y[i] + y[j]; // increase the frequency of mid point String temp = String.join(' ' String.valueOf(midX) String.valueOf(midY)); if(cnt.containsKey(temp)){ cnt.put(temp cnt.get(temp) + 1); } else{ cnt.put(temp 1); } } } // Iterating through all mid points int res = 0; for (Map.Entry<String Integer> it : cnt.entrySet()) { int freq = it.getValue(); // Increase the count of Parallelograms by // applying function on frequency of mid point res = res + freq*(freq - 1)/2; } return res; } public static void main(String[] args) { int[] x = {0 0 2 4 1 3}; int[] y = {0 2 2 2 4 4}; int N = x.length; System.out.println(countOfParallelograms(x y N)); } } // The code is contributed by Nidhi goel.
Python3 # python program to get number of Parallelograms we # can make by given points of the plane # Returns count of Parallelograms possible # from given points def countOfParallelograms(x y N): # Map to store frequency of mid points cnt = {} for i in range(N): for j in range(i+1 N): # division by 2 is ignored to get # rid of doubles midX = x[i] + x[j]; midY = y[i] + y[j]; # increase the frequency of mid point if ((midX midY) in cnt): cnt[(midX midY)] += 1 else: cnt[(midX midY)] = 1 # Iterating through all mid points res = 0 for key in cnt: freq = cnt[key] # Increase the count of Parallelograms by # applying function on frequency of mid point res += freq*(freq - 1)/2 return res # Driver code to test above methods x = [0 0 2 4 1 3] y = [0 2 2 2 4 4] N = len(x); print(int(countOfParallelograms(x y N))) # The code is contributed by Gautam goel.
C# using System; using System.Collections.Generic; public class GFG { // Returns count of Parallelograms possible // from given points public static int CountOfParallelograms(int[] x int[] y int N) { // Map to store frequency of mid points Dictionary<string int> cnt = new Dictionary<string int>(); for (int i = 0; i < N; i++) { for (int j = i + 1; j < N; j++) { // division by 2 is ignored to get // rid of doubles int midX = x[i] + x[j]; int midY = y[i] + y[j]; // increase the frequency of mid point string temp = string.Join(' ' midX.ToString() midY.ToString()); if (cnt.ContainsKey(temp)) { cnt[temp]++; } else { cnt.Add(temp 1); } } } // Iterating through all mid points int res = 0; foreach (KeyValuePair<string int> it in cnt) { int freq = it.Value; // Increase the count of Parallelograms by // applying function on frequency of mid point res += freq * (freq - 1) / 2; } return res; } public static void Main(string[] args) { int[] x = { 0 0 2 4 1 3 }; int[] y = { 0 2 2 2 4 4 }; int N = x.Length; Console.WriteLine(CountOfParallelograms(x y N)); } }
JavaScript // JavaScript program to get number of Parallelograms we // can make by given points of the plane // Returns count of Parallelograms possible // from given points function countOfParallelograms(x y N) { // Map to store frequency of mid points // map int> cnt; let cnt = new Map(); for (let i=0; i<N; i++) { for (let j=i+1; j<N; j++) { // division by 2 is ignored to get // rid of doubles let midX = x[i] + x[j]; let midY = y[i] + y[j]; // increase the frequency of mid point let make_pair = [midX midY]; if(cnt.has(make_pair.join(''))){ cnt.set(make_pair.join('') cnt.get(make_pair.join('')) + 1); } else{ cnt.set(make_pair.join('') 1); } } } // Iterating through all mid points let res = 0; for (const [key value] of cnt) { let freq = value; // Increase the count of Parallelograms by // applying function on frequency of mid point res = res + Math.floor(freq*(freq - 1)/2); } return res; } // Driver code to test above methods let x = [0 0 2 4 1 3]; let y = [0 2 2 2 4 4]; let N = x.length; console.log(countOfParallelograms(x y N)); // The code is contributed by Gautam goel (gautamgoel962)
Çıkış
2
Zaman Karmaşıklığı: Açık2logn) çünkü n'ye kadar iki döngüyü yineliyoruz ve aynı zamanda logn alan bir harita kullanıyoruz.
Yardımcı Alan: Açık)
Test Oluştur