Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

C++ में गैर-अतिव्यापी आयतों में यादृच्छिक बिंदु

मान लीजिए कि हमारे पास गैर-अतिव्यापी अक्ष-संरेखित आयतों की एक सूची है, हमें एक फ़ंक्शन पिक लिखना है जो यादृच्छिक रूप से और समान रूप से एक पूर्णांक संख्या चुनता है, आयतों द्वारा कवर किए गए स्थान में बिंदु। इसलिए हमें कुछ बातों का ध्यान रखना होगा -

  • एक पूर्णांक बिंदु वह बिंदु होता है जिसमें पूर्णांक निर्देशांक होते हैं।
  • आयताकार की परिधि पर एक बिंदु आयतों द्वारा कवर किए गए स्थान में शामिल होता है।
  • ith आयत =rects[i] [x1,y1,x2,y2] को दर्शाता है, जहां [x1, y1] निचले-बाएं कोने के पूर्णांक निर्देशांक हैं, और [x2, y2] पूर्णांक निर्देशांक हैं ऊपरी दाएं कोने।
  • प्रत्येक आयत की लंबाई और चौड़ाई 2000 से अधिक नहीं है।
  • 1 <=rects.length <=100
  • एक बिंदु को पूर्णांक निर्देशांक की एक सरणी के रूप में चुनें [p_x, p_y]

यदि इनपुट [1,1,5,5] जैसा है, और हम तीन बार पिक () कहते हैं, तो आउटपुट [4,1], [4,1], [3,3]

होगा।

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • दो सरणियों का क्षेत्र और आयत बनाएं
  • इनिशियलाइज़र में निम्न कार्य करें -
  • रेक्ट:=रेक्ट्स, योग:=0
  • i के लिए 0 से लेकर रेक्ट्स के आकार तक - 1
    • (x1, y1) :=(rects[i, 0], rects[i, 1])
    • (x2, y2) :=(rects[i, 2], rects[i, 3])
    • अस्थायी:=|x2 - x1 + 1| * |y2 - y1 + 1|
    • योग :=योग + अस्थायी, और क्षेत्र में योग डालें
  • चुनने की विधि में, निम्न कार्य करें -
  • randArea :=यादृच्छिक संख्या मॉड योग + 1
  • मैं के लिए 0 से क्षेत्र के आकार के लिए - 1
    • अगर randArea <=area[i], तो लूप से बाहर आएं
  • dist_x :=यादृच्छिक संख्या mod |rect[i,0] – rect[i,2] + 1|
  • dist_y :=यादृच्छिक संख्या mod |rect[i,1] – rect[i,3] + 1|
  • एक जोड़ी लौटाएं (dist_x + rect[i, 0], dist_y + rect[i, 1])

आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

उदाहरण

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<int> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Solution {
   public:
   vector <int> area;
   vector < vector <int> > rect;
   int sum;
   Solution(vector<vector<int> >& rects) {
      rect = rects;
      sum = 0;
      for(int i =0 ; i < rects.size(); i++){
         int x1 = rects[i][0];
         int y1 = rects[i][1];
         int x2 = rects[i][2];
         int y2 = rects[i][3];
         int temp = (abs(x2 - x1) + 1) * (abs(y2 - y1) + 1);
         sum += temp;
         area.push_back(sum);
      }
   }
   vector<int> pick() {
      int randArea = rand() % sum + 1;
      int i;
      for(i = 0; i < area.size(); i++){
         if(randArea <= area[i]) break;
      }
      int dist_x = rand() % (abs(rect[i][0] - rect[i][2] ) + 1);
      int dist_y = rand() % (abs(rect[i][1] - rect[i][3] ) + 1);
      return {dist_x + rect[i][0], dist_y + rect[i][1]};
   }
};
main(){
   vector<vector<int> > v = {{1, 1, 5, 5}};
   Solution ob(v);
   print_vector(ob.pick());
   print_vector(ob.pick());
   print_vector(ob.pick());
}

इनपुट

["Solution", "pick", "pick", "pick"]
[[[[1, 1, 5, 5]]], [], [], []]

आउटपुट

[2, 3, ]
[4, 1, ]
[3, 5, ]

  1. C++ में कंप्यूटर ग्राफिक्स में प्वाइंट क्लिपिंग एल्गोरिथम

    कंप्यूटर ग्राफिक्स कंप्यूटर स्क्रीन पर छवियों और ग्राफिक्स को चित्रित करने से संबंधित है। यहां, हम स्क्रीन को 2-डी समन्वय प्रणाली के रूप में देखते हैं। यह समन्वय प्रणाली ऊपर-बाएँ (0,0) से शुरू होती है और नीचे-दाएँ पर समाप्त होती है। विमान देखना कंप्यूटर ग्राफिक्स में ग्राफिक्स बनाने के लिए परिभाषित

  1. पता लगाएं कि कोई बिंदु C++ में वृत्त के अंदर है या नहीं

    मान लीजिए, एक वृत्त दिया गया है (केंद्र निर्देशांक और त्रिज्या), दूसरा बिंदु भी दिया गया है। हमें यह पता लगाना है कि बिंदु वृत्त के अंदर है या नहीं। इसे हल करने के लिए हमें वृत्त के केंद्र से दिए गए बिंदु की दूरी ज्ञात करनी होगी। यदि वह दूरी त्रिज्या से कम या उसके बराबर है, तो वह वृत्त के अंदर है, अ

  1. सी ++ में static_cast

    static_cast का उपयोग सामान्य/साधारण प्रकार के रूपांतरण के लिए किया जाता है। यह निहित प्रकार के जबरदस्ती के लिए जिम्मेदार कलाकार भी है और इसे स्पष्ट रूप से भी कहा जा सकता है। आपको इसका उपयोग फ्लोट को इंट, चार से इंट आदि में बदलने जैसे मामलों में करना चाहिए। यह संबंधित प्रकार की कक्षाओं को कास्ट कर सक