下圖是乙個城堡的地形圖,請你編寫乙個程式,計算城堡一共有多少個房間,最大的房間有多大。城堡被分割成mxn(m<=50,n<=50)個方塊,每個方塊可以有4面牆。
#代表牆,|-代表不是牆,走的通的就是乙個房間
輸入程式從標準輸入裝置讀入資料。
第一行是兩個整數,分別是南北向、東西向的方塊數。
在接下來的輸入行裡,每個方塊用乙個數字(0≤p≤50)描述。用乙個數字表示方塊周圍的牆,1表示西牆, 2表示北牆, 4表示東牆, 8表示南牆。每個方塊用代表其周圍牆的數字之和表示。城堡的內牆被計算兩次,方塊(1,1)的南牆同時也是方塊(2,1)的北牆。
輸入的資料保證城堡至少有兩個房間。
輸出城堡的房間數、城堡中最大房間所包括的方塊數。
結果顯示在標準輸出裝置上。
樣例輸入
4樣例輸入711 6 11 6 3 10 6
7 9 6 13 5 15 5
1 10 12 7 13 7 5
13 11 10 8 10 12 13
5第一步要解決的問題就是計算某個方塊周圍有幾面牆,通過乙個數字要算出有幾面牆,我們發現1,2,4,8,他們的二進位制位分別為0001,0010,0100,1000.比如給數3,我們看它有幾個1來表示,如果最後1位為1表明有西牆,倒數第二位有1表示有北牆,我們可以讓它與1或者2作&操作,比如6與4與操作,6是0110,4是0100,兩者相與仍為4。9
我們可以把方塊看作是節點,相鄰兩個方塊之間如果沒有牆,則在方塊之間連一條邊,這樣城堡就能轉換為乙個圖。
求房間個數,實際上就是在求圖中有多少個極大連通子圖。
乙個連通子圖,往裡頭新增任何乙個圖里的其他店,就會變得不連通,那麼這個連通子圖就是極大連通子圖(如:(8,5,6))
對每乙個房間,深度優先搜尋,從而給這個房間能夠到達的所有位置染色,最後統計一共用了幾種顏色,以及每種顏色的數量。
比如1 1 2 2 3 3 3
1 1 1 2 3 4 3
1 1 1 5 3 5 3
1 5 5 5 5 5 3
從而一共有5種房間,最大的房間(1)佔據9個格仔
#include
using namespace std;
#define maxsize 50
int rooms[maxsize]
[maxsize]
;//儲存方塊和它周圍牆的情況
int color[maxsize]
[maxsize]
;//儲存連通圖的顏色情況,也可以標記這一點有沒有被訪問過。
int roomnum=
0,maxroomarea=0;
//表示房間數和最大房間的面積
int roomarea;
//房間的面積
int m;
//行數
int n;
//列數
//從rooms[i][j]這個方塊出發,進行探索
void
dfs(
int i,
int j)
color[i]
[j]=roomnum;
//染色並標記為已訪問
++roomarea;
//如果rooms[i][j]十六進製制從右往左第1位為1的話,那麼就說明有西牆 if(
((rooms[i]
[j]&1)
==0)&&
(j>=2)
)if((
(rooms[i]
[j]&2)
==0)&&
(i>=2)
)if((
(rooms[i]
[j]&4)
==0)&&
(j<=n-1)
)if((
(rooms[i]
[j]&8)
==0)&&
(i<=m-1)
)}intmain()
}//依次訪問二維陣列中每個結點
for(
int i=
1;i<=m;i++)}
}//輸出房間數
cout<
cout<
}
C 搜尋與回溯演算法之城堡問題
城堡問題 1 2 3 4 5 6 7 1 2 3 4 圖 1 wall no wall no wall 圖1是乙個城堡的地形圖。請你編寫乙個程式,計算城堡一共有多少房間,最大的房間有多大。城堡被分割成m,n m 50,n 50 個方塊,每個方塊可以有0 4面牆。程式從標準輸入裝置讀入資料。第一行是兩...
深度優先搜尋練習題目 城堡問題
總時間限制 1000ms 記憶體限制 65536kb 描述1 2 3 4 5 6 7 1 2 3 4 圖 1 wall no wall no wall 圖1是乙個城堡的地形圖。請你編寫乙個程式,計算城堡一共有多少房間,最大的房間有多大。城堡被分割成m n m 50,n 50 個方塊,每個方塊可以有0...
演算法基礎 城堡問題 深度優先搜尋演算法
題目 圖1是乙個城堡的地形圖。請你編寫乙個程式,計算城堡一共有多少房間,最大的房間有多大。城堡被分割成m n m 50,n 50 個方塊,每個方塊可以有0 4面牆。輸入 程式從標準輸入裝置讀入資料。第一行是兩個整數,分別是南北向 東西向的方塊數。在接下來的輸入行裡,每個方塊用乙個數字 0 p 50 ...