poj2815 城堡問題(DFS)

2021-08-27 05:57:55 字數 2040 閱讀 5148

描述

1   2   3   4   5   6   7  

#############################

1 #   |   #   |   #   |   |   #

#####---#####---#---#####---#

2 #   #   |   #   #   #   #   #

#---#####---#####---#####---#

3 #   |   |   #   #   #   #   #

#---#########---#####---#---#

4 #   #   |   |   |   |   #   #

#############################

#  = wall   

|  = no wall

-  = no wall

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

輸入

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

輸出

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

樣例輸入

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 

樣例輸出5

9此題採用dfs來解

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

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

這裡引入極大連通子圖

極大連通子圖:

乙個連通子圖,往裡頭加任何乙個圖的其他頂點,就會變成不連通,那麼這個子圖就是極大連通子圖。

例如現在圖中的乙個極大連通子圖(頂點5,6,8組成的圖)

對每個房間,進行dfs,給這個房間能夠到達的所謂位置染色(編號),最後統計用了幾種顏色(房間的數目),以及用的顏色最多的數(最大房間所包括的方塊數)。

對輸入資料的處理:

題目中輸入的資料是表示方塊旁邊的牆,那麼如何根據那個數字來判斷該方塊旁邊有多少牆呢(北牆、南牆、東牆、西牆)

由於題目用1表示西牆,2表示北牆,4表示東牆,8表示南牆。所以我們可以將輸入的資料分別跟1、2、4、8進行&運算,如果有對應的牆,則&運算的結果為1。

程式**如下:

#include #include using namespace std;

int room[52][52];

int color[52][52];//方塊是否染過色

int roomnum=0,maxarea=0;//房間數,最大方塊數

int roomarea;//當前房間的方塊數

void dfs(int i,int j);

int main()

cout << roomnum << endl;

cout << maxarea << endl;

return 0;

} void dfs(int i,int j)

POJ 2815城堡問題(DFS)

poj 2815 城堡問題 dfs 思路 全部設為全域性變數,用void寫dfs函式,引數為i,j dfs函式 void型別,引數為座標,所有內容均為全域性變數 分成三部分 1.判斷是否已經訪問過,若是,直接返回 2.訪問操作 3.遞迴操作 void dfs int i,int j ac inclu...

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 個方塊,每個方塊可以有...