description
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面牆。
input
程式從標準輸入裝置讀入資料。第一行是兩個整數,分別是南北向、東西向的方塊數。在接下來的輸入行裡,每個方塊用乙個數字(0≤p≤50)描述。用乙個數字表示方塊周圍的牆,1表示西牆,2表示北牆,4表示東牆,8表示南牆。每個方塊用代表其周圍牆的數字之和表示。城堡的內牆被計算兩次,方塊(1,1)的南牆同時也是方塊(2,1)的北牆。輸入的資料保證城堡至少有兩個房間。
output
城堡的房間數、城堡中最大房間所包括的方塊數。結果顯示在標準輸出裝置上。
sample input
4sample output7 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 執行的方向。如果碰到1向西,2向北,4向東,8向南。這個**是借鑑他人的,很巧妙的用到了按位與運算。
這裡說一下按位與:
&有兩種作用,分別如下:
1. 取位址。單目運算子。用來取乙個變數的位址。比如1
2
int
i, *p;
p = &i;
//這裡的&作用是取變數i的位址。
2. 位操作中的與操作運算子。
也就是常說的and操作,雙目運算子。
計算的時候按位計算,&兩邊運算元對應位上全為1時,結果的該位值為1。否則該位值為0
比如題中的
11&1 轉為二進位制為:1011&01,按位計算結果為1不滿足題意,不向左走,
11&4 轉為二進位制為:1011&100,按位計算結果為0滿足,這個時候會向右走
常用技巧:
1、 用於整數的奇偶性判斷
乙個整數a, a& 1 這個表示式可以用來判斷a的奇偶性。二進位制的末位為0表示偶數,最末位為1表示奇數。使用a%2來判斷奇偶性和a & 1是一樣的作用,但是a & 1要快好多。
2、 判斷n
是否是2
的正整數冪
(!(n&(n-1)) )&& n
舉個例子:
如果n = 16 = 10000, n-1 = 1111
那麼:10000
& 1111
----------
0
再舉乙個例子:如果n = 256 = 100000000, n-1 = 11111111
那麼:100000000
&11111111
--------------
0
好!看完上面的兩個小例子,相信大家都有乙個感性的認識。從理論上講,如果乙個數a他是2的正整數冪,那麼a 的二進位制形式必定為1000…..(後面有0個或者多個0),那麼結論就很顯然了。
好了言歸正傳,這個題的**如下:
#include#include#include#includeusing namespace std;
int max1, sum, num = 0;
int m, n;
int map[55][55];
int mark[55][55];
void dfs(int i, int j)
int main()
{ scanf("%d%d", &n, &m);
sum = 0;
max1 = 0;
memset(mark, 0, sizeof(mark));
for (int i = 0; i
Openjudge 2815 城堡問題
對於這道題目來說的話,我們的思路是這樣的,我們首先把資料讀進來,然後把color陣列清零。我們的思路是這樣的的,給每乙個房間設定乙個對應的color陣列,然後color陣列裡面填滿不同的數字,每一種數字都代表著一種聯通的房間。相互聯通房間裡面,對應的color陣列填的就是相同的數字,然後對每個房間計...
北京大學OpenJudge 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 城堡問題
總時間限制 1000ms 記憶體限制 65536kb 123 4567 1 2 3 4 圖 1 wall no wall no wall 圖1是乙個城堡的地形圖。請你編寫乙個程式,計算城堡一共有多少房間,最大的房間有多大。城堡被分割成m n m 50,n 50 個方塊,每個方塊可以有0 4面牆。輸入...