acwing**原題通道
題意分析:
這道題難度並不大,只要熟練使用並查集
即可。給我們一張地圖,#
代表牆壁,我們用1表示西牆,2表示北牆,4表示東牆,8表示南牆,將沒有牆壁隔開的連通的方塊記為乙個房間,題目共有四問:房間的總數,最大的房間的面積,打掉一堵牆可以得到的最大的房間的面積,打掉的這堵牆在**。
這道題可以使用並查集
和floodfill
來做,這裡講解一下使用並查集的做法。(假如並查集的基礎知識不太了解,可以先事先了解一下並查集的基礎使用。)
我們可以從城堡左上角開始逐行列舉,每次列舉北邊和東邊兩個方向,就可以不漏的列舉出來所有的牆,假設列舉到的位置的數p=9
,我們需要列舉他東邊的牆,我們只需要讓p & 4
判斷是否是1,若是1則證明東邊有牆。當列舉到的方向沒有牆的話,我們就是用並查集將這兩個方塊加入到乙個連通塊中,初始cnt=n*m
,也就是開始的時候有n*m
個房間,我們連通一次,少乙個房間,最後cnt就是房間的個數。
如圖,共有五個房間:
;// p:並查集 sz:連通塊的面積
int g[n]
[n];
// 並查集合並
intfind
(int x)
intmain()
, dy[2]
=, dw[2]
=;for(
int i =
0; i< n; i++
)for
(int j =
0; j < m; j++
)for
(int u =
0; u <
2; u++)if
(!(g[i]
[j]& dw[u]))
// 如果對應方向沒有牆
}
cout << cnt << endl << max_area << endl;
max_area =0;
int rx , ry , rw;
// 從西到東 從南到北
for(
int j =
0; j < m; j++
)for
(int i = n-
1; i >=
0; i--
)for
(int u =
0; u <
2; u++)if
(g[i]
[j]& dw[u]
)// 如果有牆}}
cout << max_area << endl;
cout << rx +
1<<
' '<< ry +
1<<
' '<<
(rw ==2?
'n':
'e')
<< endl;
return0;
}
並查集 小鑫的城堡
time limit 1000ms memory limit 65536k 從前有乙個國王,他叫小鑫。有一天,他想建一座城堡,於是,設計師給他設計了好多簡易圖紙,主要是房間的連通的圖紙。小鑫希望任意兩個房間有且僅有一條路徑可以相通。小鑫現在把設計圖給你,讓你幫忙判斷設計圖是否符合他的想法。比如下面的...
小鑫的城堡(並查集)
time limit 1000ms memory limit 65536k 有疑問?點這裡 從前有乙個國王,他叫小鑫。有一天,他想建一座城堡,於是,設計師給他設計了好多簡易圖紙,主要是房間的連通的圖紙。小鑫希望任意兩個房間有且僅有一條路徑可以相通。小鑫現在把設計圖給你,讓你幫忙判斷設計圖是否符合他的...
並查集 小鑫的城堡
time limit 1000ms memory limit 65536k 從前有乙個國王,他叫小鑫。有一天,他想建一座城堡,於是,設計師給他設計了好多簡易圖紙,主要是房間的連通的圖紙。小鑫希望任意兩個房間有且僅有一條路徑可以相通。小鑫現在把設計圖給你,讓你幫忙判斷設計圖是否符合他的想法。比如下面的...