深度優先搜尋之城堡問題

2021-10-24 02:53:33 字數 2151 閱讀 7649

下圖是乙個城堡的地形圖,請你編寫乙個程式,計算城堡一共有多少個房間,最大的房間有多大。城堡被分割成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

9

第一步要解決的問題就是計算某個方塊周圍有幾面牆,通過乙個數字要算出有幾面牆,我們發現1,2,4,8,他們的二進位制位分別為0001,0010,0100,1000.比如給數3,我們看它有幾個1來表示,如果最後1位為1表明有西牆,倒數第二位有1表示有北牆,我們可以讓它與1或者2作&操作,比如6與4與操作,6是0110,4是0100,兩者相與仍為4。

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

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

乙個連通子圖,往裡頭新增任何乙個圖里的其他店,就會變得不連通,那麼這個連通子圖就是極大連通子圖(如:(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 ...