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

2021-09-01 23:55:35 字數 1897 閱讀 2950

總時間限制: 

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~4面牆。

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

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

樣例輸入

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

樣例輸出

5

9

**

這道題目技巧性非常強,問題就是求最大聯通圖的點的個數,那麼問題是如何將上面的題目轉化成乙個圖,這是乙個難點,當然可以用暴力編碼的方法,直接將上面的格點以及聯通性轉化為一維的圖,然後直接用圖的深度優先搜尋演算法就行了,但是這樣是很複雜的。

事實上,這裡直接用座標i,j表示圖中的頂點,用rooms[i][j]=a*1+b*2+c*4+d*8,編碼牆的資訊,然後用位運算得出**沒有牆,就可以進行深搜。這裡的演算法實現非常有技巧性。

#include#include#includeusing namespace std;

int rooms[60][60]; // 標記房間牆的資訊

int color[60][60]; // 標記房間是否被訪問過

int maxroomarea=0; // 最大連通區域的面積

int roomarea = 0; // 當前搜尋的連通

int roomnum ; // 聯通的房間數

void dfs(int i, int j); // 從圖中頂點標號i,j開始進行深度優先搜尋

int main()

} memset(color, 0, sizeof(color));

for (int i = 0; i < row; i++)

}} cout << roomnum << endl;

cout << maxroomarea << endl;

}void dfs(int i, int j)

if ((rooms[i][j] & 2) == 0)

if ((rooms[i][j] & 4)== 0)

if ((rooms[i][j] & 8)== 0)

}

深度優先搜尋之城堡問題

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

python練習題目

三色球問題 有紅 黃 藍三種顏色的求,其中紅球 3 個,黃球 3 個,綠球 6 個。先將這 12 個球混合放在乙個盒子中,從中任意摸出 8 個球,程式設計計算摸出球的各種顏色搭配。print red tyellow tblue for red inrange 0,4 for yellow in ra...

Hive練習題目

hive 基本操作 1 資料自己造 a表 id int,name string b表 id int,job id int,num int c表 job id int,job string 建表語句 載入資料 a表和b表進行鏈結操作,並觀察結果 內連線 左連線 left join 小表在前,大表在後 ...