কম্পিউটার

C++ এ Klee's Algorithm (একটি লাইনের সেগমেন্টের ইউনিয়নের দৈর্ঘ্য)


এই টিউটোরিয়ালে, আমরা একটি প্রোগ্রাম লিখতে যাচ্ছি যা একটি লাইনের অংশগুলির মিলনের দৈর্ঘ্য খুঁজে বের করে৷

আমাদের লাইন সেগমেন্টের শুরু এবং শেষ বিন্দু দেওয়া হয়েছে এবং আমাদের লাইনের অংশগুলির মিলনের দৈর্ঘ্য খুঁজে বের করতে হবে।

আমরা যে অ্যালগরিদমটি ব্যবহার করতে যাচ্ছি তাকে বলা হয় ক্লিস অ্যালগরিদম৷

আসুন সমস্যা সমাধানের পদক্ষেপগুলি দেখি৷

  • সমস্ত সেগমেন্টের স্থানাঙ্ক সহ অ্যারে শুরু করুন।
  • সেগমেন্ট অ্যারের দ্বিগুণ আকারের সাথে পয়েন্ট নামক একটি ভেক্টর শুরু করুন।
  • সেগমেন্ট অ্যারের উপর পুনরাবৃত্তি করুন।
    • বর্তমান সেগমেন্টের প্রথম পয়েন্ট এবং মিথ্যা দিয়ে ইনডেক্স i * 2 এ পয়েন্ট অ্যারের মান পূরণ করুন।
    • বর্তমান সেগমেন্টের দ্বিতীয় বিন্দু দিয়ে i * 2 + 1 সূচকে পয়েন্ট অ্যারের মান পূরণ করুন এবং মিথ্যা।
  • পয়েন্ট অ্যারে সাজান।
  • একটি কাউন্টার ভেরিয়েবল দিয়ে পয়েন্ট অ্যারের উপর পুনরাবৃত্তি করুন।
    • যদি কাউন্টারটি 0-এর বেশি হয়, তাহলে ফলাফলে i এবং i - 1-এর প্রথম বিন্দু যোগ করুন।
    • যদি দ্বিতীয় পয়েন্ট থাকে তাহলে কাউন্টারটি হ্রাস করুন অন্যথায় এটি বৃদ্ধি করুন।
  • ফলাফল ফেরত দিন।

উদাহরণ

আসুন কোডটি দেখি।

#include<bits/stdc++.h>
using namespace std;
int segmentUnionLength(const vector<pair <int,int>> &segments) {
   int n = segments.size();
   vector<pair<int, bool>> points(n * 2);
   for (int i = 0; i < n; i++) {
      points[i*2] = make_pair(segments[i].first, false);
      points[i*2 + 1] = make_pair(segments[i].second, true);
   }
   sort(points.begin(), points.end());
   int result = 0, count = 0;
   for (int i = 0; i < n * 2; i++){
      if (count) {
         result += points[i].first - points[i-1].first;
      }
      points[i].second ? count-- : count++;
   }
   return result;
}
int main() {
   vector<pair<int,int>> segments;
   segments.push_back(make_pair(1, 3));
   segments.push_back(make_pair(2, 7));
   segments.push_back(make_pair(6, 12));
   segments.push_back(make_pair(13, 5));
   cout << segmentUnionLength(segments) << endl;
   return 0;
}

আউটপুট

আপনি যদি উপরের কোডটি চালান, তাহলে আপনি নিম্নলিখিত ফলাফল পাবেন।

6

উপসংহার

টিউটোরিয়ালে আপনার কোন প্রশ্ন থাকলে মন্তব্য বিভাগে উল্লেখ করুন।


  1. C++ এ রেখার প্রতিফলন

  2. C++ এ একটি লাইনে সর্বোচ্চ পয়েন্ট

  3. C++ এ কম্পিউটার গ্রাফিক্সে পয়েন্ট ক্লিপিং অ্যালগরিদম

  4. একটি লাইন C++ এ একটি বৃত্ত স্পর্শ করে বা ছেদ করে কিনা তা পরীক্ষা করুন