描述
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
59
1 #include2 #include3 #include4 #include5using
namespace
std;
6int n, m;//
行數,列數
7int room[51][51];//
儲存房間資訊
8int color[51][51];//
標記陣列,用來檢查乙個房間是否已經走過
9int roomnum = 0, maxarea = 0;//
總的房間數和最大房間面積
10int area = 0;//
當前正在走的房間的面積
11void dfs(int i,int j)//
對當前位置做dfs,會得到該房間所在的聯通分量
1219
//cout << "(" << i << "," << j << ")不是舊點" << endl;
20 area++;
21//
標記為舊點
22 color[i][j] =roomnum;
23//
按西北東南的順序做dfs,本題不用考慮邊界問題,因為輸入保證了四周都有牆,dfs一定會在到達邊界的時候停下來
24if (!(room[i][j] & 1))//
西邊沒有牆往西走
2529
30if (!(room[i][j] & 2))//
北邊沒有牆往北走
3135
36if (!(room[i][j] & 4))//
東邊沒有牆往東走
3741
42if (!(room[i][j] & 8))//
南邊沒有牆往南走
434748}
49int
main()
5068
}69 cout << roomnum <70 cout << maxarea <71return0;
72 }
百練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 城堡問題
總時間限制 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...
百練2815 城堡問題
運用了與運算 兩者都有才1,乙個沒有即為0 特別容易錯的地方 想用與運算什麼的,只要是涉及了二進位制的,都要加括號,二進位制運算的優先順序很低,特別低 只要涉及了二進位制,都要加括號,二進位制運算的優先順序很低,特別低 只要是涉及了二進位制的,都要加括號,二進位制運算的優先順序很低,特別低 incl...