【問題描述】
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...