總時間限制:
1000ms
記憶體限制:
65536kb
描述
1 2 3 4 5 6 7#############################
1 # | # | # | | #
#####---#####---#---#####---#
2 # # | # # # # #
#---#####---#####---#####---#
3 # | | # # # # #
#---#########---#####---#---#
4 # # | | | | # #
#############################
(圖 1)
# = wall
| = no wall
- = no wall
圖1是乙個城堡的地形圖。請你編寫乙個程式,計算城堡一共有多少房間,最大的房間有多大。城堡被分割成mn(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 小表在前,大表在後 ...