2815:城堡問題
檢視 提交 統計 提示 提問
總時間限制: 1000ms 記憶體限制: 65536kb
描述 請你編寫乙個程式,計算城堡一共有多少房間,最大的房間有多大。城堡被分割成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
** 1164
題解:dfs求連通塊問題。從乙個沒有訪問過的點出發,dfs此點附近所有可以到達的點,函式返回值是此點周圍所有沒有被訪問過且能到達的點的數目總和。比較各個返回值大小,最大的就是題目要求的最大房間方塊數。如果乙個連通塊求完後沒有覆蓋所有房間,即仍有房間的vis為0,則重新求連通塊,再比較出最大房間方塊數。而每重新求連通塊的時候都使num++,這樣就能算出總共有多少房間。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
const
int maxn = 55;
int room[maxn][maxn], vis[maxn][maxn], maxsiz, num;
int m, n;
int dfs(int x, int y)
if (x + 1
<= m && !vis[x + 1][y] && (room[x][y] & 8) == 0)
if (y + 1
<= n && !vis[x][y + 1] && (room[x][y] & 4) == 0)
if (y - 1 >= 1 && !vis[x][y - 1] && (room[x][y] & 1) == 0)
return siz1 + 1;
}int main()
}for (int i = 1; i <= m; i++) }}
}printf ("%d\n%d\n", num, maxsiz);
return
0;}
城堡問題 dfs
首先這一題的難度不是很大,但是也要用到位運算的知識,這個讓我想到之前學的位運算遍歷,這裡也是用位運算來判斷乙個點牆的數目。這題思路會有點不好找,但是整體題目難度並不大,適合深搜的入門。圖 一 是乙個城堡的地形圖。請你編寫乙個程式,計算城堡一共有多少房間,最大的房間有多大。城堡被分割成m n m 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 個方塊,每個方塊可以有...
百練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 個方塊,每個方塊可以有...