《挑戰程式設計競賽》164頁 區域個數

2021-07-15 10:34:35 字數 1495 閱讀 3306

【問題描述】

w*h的格仔畫了n條或垂直或水平寬度為1的直線,求出這些格仔被劃分成了多少個4連塊(上、下、左、右連通)。

【輸入格式】

第一行包含兩個整數:w和h,表示矩陣的列數和行數(行列編號都從1開始)。

第二行包含乙個整數n,表示有n條直線。

接下來的n行,每行包含四個整數:x1,y1,x2,y2,表示一條直線的列號和行號。

【輸出格式】

乙個整數,表示區域數量。

【輸入樣例】

10 10

5 1 4 6 4

1 8 10 8

4 1 4 10

9 1 9 5

10 6 10 10

【輸出樣例】

【資料範圍】

1<=w,h<=1000000 , 1<=n<=500

【**】

《挑戰程式設計競賽》164頁

這是一道離散化和連通分量的結合題(由於w,h範圍太大,n的範圍小,所以才想到用離散化,畢竟直接求連通分量要超時),首先我們需要講點的座標離散化,我採取的是x,y分開離散化(值得注意的是除了直線的座標以外,它周圍的座標也要離散化),然後再在離散化了的圖上進行連通分量的查詢。

#include

#include

#include

#include

using namespace std;

const int maxn=505;

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

intx[maxn*6],y[maxn*6];

int n,w,h,nx,ny;

int dx=;

int dy=;

bool vis[maxn*6][maxn*6];

struct shu

q[maxn*maxn

*36];

intread()

return ok==1?-x:x;

}void init()

}void work()

sort(x+1,x+1+k);

sort(y+1,y+1+t);

nx=1;

for(int i=2;i<=k;i++)

if(x[i]!=x[i-1]) x[++nx]=x[i];

ny=1;

for(int i=2;i<=t;i++)

if(y[i]!=y[i-1]) y[++ny]=y[i];

for(int i=1;i<=n;i++)

for(int i=1;i<=n;i++)

}void bfs(int

x,inty);

vis[x][y]=1;

while(root!=frond)

;;vis[xx][yy]=1;}}

}int main()

printf("%d",ans);

return

0;}

《挑戰程式設計競賽》P164 座標離散化

問題描述 w h的格仔畫了n條或垂直或水平寬度為1的直線,求出這些格仔被劃分成了多少個4連塊 上 下 左 右連通 輸入格式 第一行包含兩個整數 w和h,表示矩陣的列數和行數 行列編號都從1開始 第二行包含乙個整數n,表示有n條直線。接下來的n行,每行包含四個整數 x1,y1,x2,y2,表示一條直線...

挑戰程式設計競賽(3)

給定整數a1,a2,an,判斷是否可以從中選出若干數,使他們的和恰好為k。1 n 20 1e8 ai 1e8 1e8 k 1e8 樣例1input 4 1 2 4 7 13 output yes 13 2 4 7 樣例2input 4 1 2 4 7 15 output no dfs include...

挑戰程式設計競賽 樹

二叉樹的表達 樹的遍歷 從根r到結點x的路徑長度為x的深度 depth 結點x到葉結點的最大路徑長度成為結點x的高。請編寫乙個程式,輸出給定有根樹t中各節點u的資訊。採用 左子右兄弟表示法 1 結點u的父節點 2 結點u最左側的子結點 3 結點u右側緊鄰的兄弟結點 引用u.parent即可知道結點u...