Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> सी प्रोग्रामिंग

C में एक बिंदु से गुजरने वाली अधिकतम विशिष्ट रेखाएं

हमें N रेखाएं दी गई हैं, प्रत्येक दो बिंदुओं (x1,y1) और (x2,y2) द्वारा परिभाषित। लक्ष्य: दी गई रेखाओं में से अधिकतम संख्या ढूंढें जो एक ही बिंदु से गुजर सकती हैं, ऐसी शर्त के साथ कि कोई दो रेखाएं एक-दूसरे को ओवरलैप न करें, और कोई रोटेशन न किया जाए।

दृष्टिकोण

  • रेखाओं को जोड़ी (m, c) के रूप में दर्शाएं जहां y = mx + c
  • ढलान m = (y2 - y1) / (x2 - x1)
  • समान m वाली रेखाएं समानांतर होती हैं (यदि c1 ≠ c2)
  • अद्वितीय ढलानों (m) की गिनती करें - प्रत्येक अद्वितीय ढलान एक रेखा का प्रतिनिधित्व करती है जो एक सामान्य बिंदु से गुजर सकती है
  • लंबवत रेखाओं के लिए (x1 = x2), ढलान = INT_MAX (या एक बड़ा मान) मानें

उदाहरण 1

रेखा 1: (4,10) से (2,2) → m = (2-10)/(2-4) = -8/-2 = 4
रेखा 2: (2,2) से (1,1) → m = (1-2)/(1-2) = -1/-1 = 1
अद्वितीय ढलानें: 4, 1 → अधिकतम रेखाएं: 2

उदाहरण 2

रेखा 1: (1,5) से (3,2) → m = (2-5)/(3-1) = -3/2 = -1.5
रेखा 2: (2,7) से (2,8) → x1=x2, लंबवत → m = INT_MAX
अद्वितीय ढलानें: -1.5, INT_MAX → अधिकतम रेखाएं: 2

C प्रोग्राम

#include <stdio.h>
#include <limits.h>

int numLines(int n, int x1[], int y1[], int x2[], int y2[]) {
    double slopes[100];
    int k = 0;
    double slope;
    
    for(int i = 0; i < n; i++) {
        if(x1[i] == x2[i]) {
            slope = INT_MAX;  // लंबवत रेखा
        } else {
            slope = (double)(y2[i] - y1[i]) / (x2[i] - x1[i]);
        }
        
        // जांचें कि क्या यह ढलान पहले से मौजूद है
        int found = 0;
        for(int j = 0; j < k; j++) {
            if(slopes[j] == slope) {
                found = 1;
                break;
            }
        }
        if(!found) {
            slopes[k++] = slope;
        }
    }
    return k;
}

int main() {
    int n = 2;
    int x1[] = {1, 5}, y1[] = {3, 2};
    int x2[] = {2, 7}, y2[] = {2, 8};
    
    printf("अधिकतम विशिष्ट रेखाएं: %d\n", numLines(n, x1, y1, x2, y2));
    return 0;
}

आउटपुट

अधिकतम विशिष्ट रेखाएं: 2

सुधार: फ्लोटिंग-पॉइंट तुलना

ढलानों की तुलना करते समय फ्लोटिंग-पॉइंट सटीकता समस्याओं से बचने के लिए:

// भिन्न के रूप में संग्रहीत करें: (dy, dx) को GCD से सरल करके
typedef struct { int dy, dx; } Slope;

int gcd(int a, int b) {
    return b == 0 ? a : gcd(b, a % b);
}

Slope normalize(int dy, int dx) {
    if(dx < 0) { dy = -dy; dx = -dx; }
    int g = gcd(abs(dy), abs(dx));
    return (Slope){dy/g, dx/g};
}

// लंबवत रेखा के लिए: {1, 0} या {-1, 0}

जटिलता

  • समय: O(n²) सरल सरणी खोज के साथ, O(n log n) सॉर्टिंग/हैशिंग के साथ
  • स्थान: O(n)
  1. - C प्रोग्राम में ऐरे में अधिकतम AND मान वाली जोड़ी प्रिंट करना

    समस्या के अनुसार हमें n पॉजिटिव इंटीजर्स का एक ऐरे दिया गया है, हमें ऐरे से अधिकतम AND मान वाली जोड़ी ढूंढनी है। उदाहरण इनपुट: arr[] = { 4, 8, 12, 16 } आउटपुट: pair = 8 12 अधिकतम AND मान = 8 इनपुट: arr[] = { 4, 8, 16, 2 } आउटपुट: pair = No possible AND अधिकतम AND मान = 0 अधिकतम AND मान ढूंढना ऐर

  1. C प्रोग्राम में दिए गए आकार का अधिकतम योग वाला वर्ग उप-मैट्रिक्स प्रिंट करें C प्रोग्राम में दिए गए आकार का अधिकतम योग वाला वर्ग उप-मैट्रिक्स प्रिंट करें

    समस्या विवरण N x N का एक मैट्रिक्स दिया गया है, M x M का एक उप-मैट्रिक्स ढूंढें जहां M = 1 ताकि मैट्रिक्स M x M के सभी तत्वों का योग अधिकतम हो। मैट्रिक्स N x N के इनपुट में शून्य, सकारात्मक और नकारात्मक पूर्णांक मान हो सकते हैं। उदाहरण इनपुट: {{1, 1, 1, 1, 1}, {2, 2, 2, 2, 2}, {3, 3, 3, 3, 3},

  1. Matplotlib में दो रेखाओं के प्रतिच्छेदन बिंदु से गुजरने वाली क्षैतिज और ऊर्ध्वाधर रेखाएं कैसे प्लॉट करें? Matplotlib में दो रेखाओं के प्रतिच्छेदन बिंदु से गुजरने वाली क्षैतिज और ऊर्ध्वाधर रेखाएं कैसे प्लॉट करें?

    दो रेखाओं का प्रतिच्छेदन बिंदु ढूंढकर, उस पर से गुजरने वाली डॉटेड क्षैतिज और ऊर्ध्वाधर रेखाएं प्लॉट करें। चरण फिगर साइज़ और ऑटोलेआउट सेट करें। दो रेखाओं के स्लोप (m1, m2) और इंटरसेप्ट (c1, c2) परिभाषित करें। x रेंज बनाएं और दोनों रेखाएं प्लॉट करें। प्रतिच्छेदन बिंदु कैलकुलेट करें: xi = (c1 - c2) /