OpenJudge 2815 城堡問題

2021-07-24 08:53:29 字數 2559 閱讀 5745

description

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

input

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

output

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

sample input

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

sample output

5

9

這個題讀起來很費力,其實就是簡單的說每乙個房間的

周圍牆的數字之和的判斷來判斷dfs 執行的方向。如果碰到1向西,2向北,4向東,8向南。這個**是借鑑他人的,很巧妙的用到了按位與運算。

這裡說一下按位與:

&有兩種作用,分別如下:

1. 取位址。單目運算子。用來取乙個變數的位址。比如1

2

inti, *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面牆。輸入...