二維座標離散化

2022-03-28 19:38:01 字數 1408 閱讀 3639

離散化的思想就是將分布大卻數量少(即稀疏)的資料進行集中化的處理,這樣可以有利於程式的空間與時間,能減少遍歷次數與空間儲存。

然而雖然我會了思想今天問了翔神半天才知道怎麼實現。。

其實實現的方式與口述的角度還是有所不同。

思想理解起來其實道理很簡單,如座標(3,2000),(10005,31),(10006,5)離散至新圖,先看x座標,3個點有3,10005,10006,離散後即1,3,4; 3 -> 1,由於10005與3不是連續的兩個數故10005 -> 3,又10006與10005是連續的兩個數(即相鄰)故10006 -> 4,同理看y座標,3個點有2000,31,5,按上面的思想離散的結果即5 -> 1,31 -> 3,2000 -> 5。離散後三個點座標為(1,5),(3,3),(4,1)

**實現的方式並不是很簡單。先用 結構體or兩個陣列(這裡我用的結構體 node )存下需要離散的點(x,y),再用乙個陣列 x[ ]存所有點的x座標,用陣列 y[ ]存所有點的y座標,為了能按順序離散以及提高效率,將在陣列 x[ ],y[ ]中加入原圖的最小最大值來表示圖的邊界,然後排序並去重。得到處理後陣列長度len1,len2。

設乙個tot用來表示新圖的下標,然後就for i in len一遍判斷前後兩個數如果只相差1說明連續,則tot++就可以用乙個陣列 nx[ ],ny[ ]存 下乙個點,否則可以存乙個中間值。這樣就得到了乙個原座標與離散座標的乙個對映關係,這種對映關係即nx[ ],ny[ ]裡每個下標與相應值。

在按照這個對映關係將一開始存在node裡的x,y用lower_bound(nx,nx+tot,node[ i ].x) - nx得到對應下標,y同理省略,存入新圖。

綜上離散完畢。

附上離散板子

注意最後存的陣列ma中的maxn應該是2*點數+5。

1 #include2 #include3

using

namespace

std;

4const

int maxn = 點數;//

這個就是離散完的圖的大小

5const

int maximum =離散前圖的最大邊界;

6struct

node

7node[maxn];

10int

x[maxn], y[maxn];

11int

nx[maxn], ny[maxn];

12int m[maxn*2+5][maxn*2+5

];13

void discrete(int

n)14

30//

離散y軸

31for(int i = 0; i < len2;i++)

3236

//用對映關係將需離散的點放入離散圖中

37for(int i = 0;i < n;i++)

3843 }

座標離散化

問題 在w h的格仔上畫了n條垂直或者水平的寬度為1的直線。求出這些直線將格仔劃分為了多少個區域?限制條件 1 w,h 1000000 1 n 500 輸入 首先輸入w,h,n 然後輸入對應的x1,x2,y1,y2.輸出區域的個數。輸入 10 10 5 x1 1 1 4 9 10 x2 6 10 4...

座標離散化

原理 從稀疏矩陣中把有效資料提出來,放在乙個新的座標系中 include include include include include include include const int inf 1e6 const int maxn 510 using namespace std int w,h,...

座標離散化

問題 在w h的格仔上畫了n條垂直或者水平的寬度為1的直線。求出這些直線將格仔劃分為了多少個區域?限制條件 1 w,h 1000000 1 n 500 輸入 首先輸入w,h,n 然後輸入對應的x1,x2,y1,y2.輸出區域的個數。輸入 10 10 5 x1 1 1 4 9 10 x2 6 10 4...