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