C ++中非重叠矩形中的随机点
假设我们有一个不重叠的,与轴对齐的矩形rects的列表,我们必须编写一个函数pick,它随机且均匀地选取一个整数,指向矩形所覆盖的空间。所以我们必须记住一些要点-
整数点是具有整数坐标的点。
矩形周长上的点包含在矩形所覆盖的空间中。
第ith个矩形=rects[i]表示[x1,y1,x2,y2],其中[x1,y1]是左下角的整数坐标,而[x2,y2]是左上角的整数坐标。右上角。
每个矩形的长度和宽度不超过2000。
1<=矩形长度<=100
选择将点作为整数坐标[p_x,p_y]的数组返回
如果输入类似于[1,1,5,5],我们调用pick()了三次,那么输出将为[4,1],[4,1],[3,3]
为了解决这个问题,我们将遵循以下步骤-
使两个数组区域和矩形
在初始化程序中执行以下操作-
rect:=rects,sum:=0
对于范围在0到rects范围内的i–1
(x1,y1):=(rects[i,0],rects[i,1])
(x2,y2):=(rects[i,2],rects[i,3])
temp:=|x2–x1+1|*|y2–y1+1|
sum:=sum+temp,并将sum插入区域
在pick方法中,执行以下操作-
randArea:=随机数模和+1
对于范围从0到区域大小的i–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, ]