首先這一題的難度不是很大,但是也要用到位運算的知識,這個讓我想到之前學的位運算遍歷,這裡也是用位運算來判斷乙個點牆的數目。這題思路會有點不好找,但是整體題目難度並不大,適合深搜的入門。
圖(一)是乙個城堡的地形圖。請你編寫乙個程式,計算城堡一共有多少房間,最大的房間有多大。城堡被分割成mn(m≤50,n≤50)個方塊,每個方塊可以有0~4面牆。
input程式從標準輸入裝置讀入資料。第一行是兩個整數,分別是南北向、東西向的方塊數。在接下來的輸入行裡,每個方塊用乙個數字(0≤p≤50)描述。用乙個數字表示方塊周圍的牆,1表示西牆,2表示北牆,4表示東牆,8表示南牆。每個方塊用代表其周圍牆的數字之和表示。城堡的內牆被計算兩次,方塊(1,1)的南牆同時也是方塊(2,1)的北牆。輸入的資料保證城堡至少有兩個房間。output城堡的房間數、城堡中最大房間所包括的方塊數。結果顯示在標準輸出裝置上。
sample input
4 7
11 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
sample output59
解題思路:
1,把方塊看成是結點,相鄰兩個方塊之間如果沒有牆,則在方塊之間連一條邊,這樣城堡就能轉化成乙個圖。
2,求房間的個數,實際就是求圖中有多少個極大連通子圖。
3,乙個連通子圖,往裡頭加任何乙個圖里其他點,就會變得不連通,那麼這個連通子圖就是極大連通子圖。
這個其實我更喜歡叫做染色法(就是我之前有看過floodfill漫水填充法就是類似的原理),把相連的房間用相同的數字填充就充當了染色的作用。
還有乙個很重要在我看來也是這一題最難的一部分就是怎麼描述牆的狀態與相連情況。這個地方使用位運算。
輸入的每乙個方塊的值就是牆的數字之和,而1,2,4,8,剛好是二進位制中只有一位是1後面都是零的數字,所以這些數字相加就是相當於位運算中的與運算,如果與的結果是1說明有該牆。如果結果是0就說明沒有該牆。沒有牆就說明相連了,相連了就說明可以往下搜尋了(有點囉嗦)。
行數和列數
int rooms[60][60];//
這個是用來儲存城堡資訊的
int color[60][60];//
方塊是否染色了
int maxroomarea = 0;//
記錄房間的最大大小
int roomnum = 0;//
記錄房間的數量
int roomarea;//
記錄房間的大小
void dfs(int i, int
k)
//後面就是把舊點換成新點就好了
++roomarea;
color[i][k] =roomnum;
//這一步其實也叫做染色
//後面的步驟其實就是走到與這個點相鄰的,在這題中這個條件其實就是沒有牆來阻擋
if ((rooms[i][k] & 1) == 0) dfs(i, k - 1);//
沒有西牆,往西邊走
if ((rooms[i][k] * 2) == 0) dfs(i - 1, k);//
沒有北牆,往北走
if ((rooms[i][k] & 4) == 0) dfs(i, k + 1);//
沒有東牆,往東走
if ((rooms[i][k] & 8) == 0) dfs(i + 1, k);//
沒有南牆,往南走。
}int
main( )
}memset(color,
0, sizeof
(color));
for (int i = 1; i <= r; i++) }}
cout
<< roomnum <
cout
<< maxroomarea <
return0;
}後面就根據這個題目來總結一下深搜的基本形式把!其實這題好像還不需要用鄰接表或者臨界矩陣來儲存,因為這題資料是***的,保證是有牆的。陣列中每乙個點都是有用的(這樣說有一點怪哦)。
城堡問題(簡單DFS)
2815 城堡問題 檢視 提交 統計 提示 提問 總時間限制 1000ms 記憶體限制 65536kb 描述 請你編寫乙個程式,計算城堡一共有多少房間,最大的房間有多大。城堡被分割成m n m 50,n 50 個方塊,每個方塊可以有0 4面牆。輸入 程式從標準輸入裝置讀入資料。第一行是兩個整數,分別...
2815 城堡問題(dfs)
總時間限制 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 個方塊,每個方塊可以有...
百練2815 城堡問題(DFS)
總時間限制 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 個方塊,每個方塊可以有...