座標離散化

2021-07-17 03:29:20 字數 1772 閱讀 8177

問題:

在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 9 10

y1:4 8 1 1 6

y2:4 8 10 5 10

輸出:

6分析:

我們可以用乙個陣列表示所有的格仔,然後將格仔分為直線上的和不在直線上的,然後進行bfs搜尋。但是由於w,h很大,沒辦法開那麼大的陣列。所以我們要利用座標離散化得技巧。

如輸入樣例所示:

座標離散化的主要思想是:將前後沒有變化的行列消除後並不影響區域的個數

陣列裡只需要儲存有直線的行列和前後的行列就足夠了,這樣的話大小最多為6n*6n了。

然後在利用bfs搜尋即可。

**:

#include 

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 500;

int w,h,n;

int x1[maxn],x2[maxn],y1[maxn],y2[maxn];

bool fld[maxn*6][maxn*6];

int dx[4]=;

int dy[4]=;

//對x1和x2進行座標離散化,並返回離散後的寬度。(對於y1,y2同理)

//將x1,x2更新為離散後的x1,x2.y不變在x方向上縮小。(處理y1,y2時同理)

int compress(int *x1,int *x2,int w)

}sort(xs.begin(),xs.end());

xs.erase(unique(xs.begin(),xs.end()),xs.end());//去重

for(int i = 0; i < n; i++)//轉化為新的x1,x2;

return xs.size();

}void solve()}}

//利用bfs計算區域數

int ans=0;

for(int y=0;yfor(int x=0;xif(fld[y][x]) continue;

ans++;

queue

int, int> > que;

que.push(make_pair(x,y));

while(!que.empty())}}

}printf("%d\n",ans);

}int main()

return0;}

/*輸入:

10 10 5

1 1 4 9 10

6 10 4 9 10

4 8 1 1 6

4 8 10 5 10

輸出:6

*/

座標離散化

原理 從稀疏矩陣中把有效資料提出來,放在乙個新的座標系中 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...

二維座標離散化

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