離散化的思想就是將分布大卻數量少(即稀疏)的資料進行集中化的處理,這樣可以有利於程式的空間與時間,能減少遍歷次數與空間儲存。
然而雖然我會了思想今天問了翔神半天才知道怎麼實現。。
其實實現的方式與口述的角度還是有所不同。
思想理解起來其實道理很簡單,如座標(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 #include3using
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...