演算法基礎 城堡問題 深度優先搜尋演算法

2021-10-20 05:00:06 字數 1439 閱讀 6282

題目:

圖1是乙個城堡的地形圖。請你編寫乙個程式,計算城堡一共有多少房間,最大的房間有多大。城堡被分割成m×n(m≤50,n≤50)個方塊,每個方塊可以有0~4面牆。

輸入

程式從標準輸入裝置讀入資料。第一行是兩個整數,分別是南北向、東西向的方塊數。在接下來的輸入行裡,每個方塊用乙個數字(0≤p≤50)描述。用乙個數字表示方塊周圍的牆,1表示西牆,2表示北牆,4表示東牆,8表示南牆。每個方塊用代表其周圍牆的數字之和表示。城堡的內牆被計算兩次,方塊(1,1)的南牆同時也是方塊(2,1)的北牆。輸入的資料保證城堡至少有兩個房間。

輸出

城堡的房間數、城堡中最大房間所包括的方塊數。結果顯示在標準輸出裝置上。

樣例輸入47

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

樣例輸出59

問題分析:

1.把方塊看作是節點,相鄰兩個方塊之間如果沒有牆,則在方塊之間連一條邊,這樣城堡就能轉換成乙個圖。

求房間個數,實際上就是在求圖中有多少個極大連通子圖。

2.對每乙個房間,深度優先搜尋,從而給這個房間能夠到達的所有位置染色。最後統計一共用了幾種顏色,以及每種顏色的數量。

比如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個格仔

3.搜尋時,怎樣知道哪些有牆哪些沒有牆?我們可以知道1,2,4,8對應二進位制的0001,0010,0100,1000。則可以根據數字轉換為二進位制,哪位有1則對應**有牆。

4.根據與運算,x(abcd) & 1(0001)=1 可知d位為1。這樣分別&每個數就知道有沒有牆。

#include

using

namespace std;

int room[55]

[55];

int color[55]

[55];

int roomnum=0;

int maxroomarea=0;

int roomarea;

void

dfs(

int i,

int j)

intmain()

}}cout<

cout<

return0;

}

這個程式對應的深搜模板就是遍歷所有結點。

深度優先搜尋之城堡問題

下圖是乙個城堡的地形圖,請你編寫乙個程式,計算城堡一共有多少個房間,最大的房間有多大。城堡被分割成mxn m 50,n 50 個方塊,每個方塊可以有4面牆。代表牆,代表不是牆,走的通的就是乙個房間 輸入程式從標準輸入裝置讀入資料。第一行是兩個整數,分別是南北向 東西向的方塊數。在接下來的輸入行裡,每...

基礎演算法 深度優先搜尋

祝食用愉快xd 是一道胡亂出的題 u56815 來走迷宮鴨!深度優先搜尋,如果能不碰牆地到達右下角的出口,就把旗子立起來表示找到了出口。什麼?你沒聽過深度優先搜尋 沒事,且聽我道來。那,深度優先搜尋又是什麼呢?拿走迷宮這事兒說起。如果你玩過 mc 或者無論從哪個去掉了解走迷宮的時候用的 右手法則 那...

深度優先搜尋練習題目 城堡問題

總時間限制 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...