1250 The Castle(廣度優先搜尋)

2021-10-02 15:46:31 字數 2715 閱讀 5876

【題目描述】

一座城堡被分成m*n個方塊(m≤50,n≤50),每個方塊可有0~4堵牆(0表示無牆)。下面示出了建築平面圖:

圖中的加粗黑線代表牆。幾個連通的方塊組成房間,房間與房間之間一定是用黑線(牆)隔開的。

現在要求你編乙個程式,解決以下2個問題:

1、該城堡中有多少個房間?

2、最大的房間有多大?

【輸入】

平面圖用乙個數字表示乙個方塊(第1個房間用二進位制1011表示,0表示無東牆,用十進位制11表示)。

第一行乙個整數m(m≤50),表示房子南北方向的長度。

第二行乙個整數n(n≤50),表示房子東西方向的長度。

後面的m行,每行有n個整數,每個整數都表示平面圖對應位置的方塊的特徵。每個方塊中牆的特徵由數字p來描述(0≤p≤15)。數字p是下面的可能取的數字之和:

1(西牆 west)

2(北牆 north)

4(東牆 east)

8(南牆 south)

室內的牆被定義兩次: 例如方塊(1,1)中的南牆也被位於其南面的方塊(2,1)定義了一次。

建築中至少有兩個房間。

【輸出】

第1行:乙個整數,表示房間總數;

第2行:乙個整數,表示最大房間的面積(方塊數)。

【輸入樣例】47

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

題目分析:

這個題 只要信心一點就能發現最後會出現16個數,並且每個數都代表著乙個房間有不同的牆。而我們只要在搜尋的時候給不同的情況分別新增上特殊判斷,就和正常的搜尋一樣的。做完這個題之後看了一下別人的**,發現用了位運算,但很遺憾,我還沒碰過位運算,以後補上。。

這裡我們假設從第乙個格仔開始走,走的第乙個方向是向南走,那麼就要保證要走到的那個格仔沒有北牆阻擋你,如果有就選擇下乙個方向。我們可以用乙個二維陣列來表示走的方向(這個學過搜尋的應該都會)。

int d[4]

[2]=

;

第乙個下標為0表示要向南走,1表示北,2表示東,3表示西。

那麼怎麼判斷下乙個格仔有沒有阻擋自己的牆呢?

int nan[20]

=;int bei[20]

=;int xi[20]

=;int dong[20]

=;

於是就出現了我這麼乙個不懂位運算的寫法,1表示可以通行,即沒有對應方向的牆。0表示有對應方向的牆。

經過這些處理後這個問題就轉化成了乙個求連通塊的題,很簡單。

完整**:

#include

#include

using

namespace std;

int n,m,sum=

0,maxs=-1

;int d[4]

[2]=

;//四個方向

int tu[

100]

[100];

//房間地圖

int nan[20]

=;//對應不同方向的牆

int bei[20]

=;int xi[20]

=;int dong[20]

=;void

bfs(

int,

int)

;int

main()

} cout<

cout<

return0;

}void

bfs(

int x,

int y)

if(i==

1&&nan[tu[xx]

[yy]

]&&tu[xx]

[yy]!=-

1&&xx>

0&&xx<=n&&yy>

0&&yy<=m)

if(i==

2&&xi[tu[xx]

[yy]

]&&tu[xx]

[yy]!=-

1&&xx>

0&&xx<=n&&yy>

0&&yy<=m)

if(i==

3&&dong[tu[xx]

[yy]

]&&tu[xx]

[yy]!=-

1&&xx>

0&&xx<=n&&yy>

0&&yy<=m)

} nx.

pop();

ny.pop();

}if(s>maxs) maxs=s;

//遇到大面積房間就覆蓋maxs

}

結果:

輸入:47

116116

31067

96135

155110

127137

5131110810

1213

輸出:5

9process returned 0

(0x0

) execution time :

2.250 s

press any key to continue

.

題目1250 矩陣變換

題目描述 對於乙個整數矩陣,存在一種運算,對矩陣中任意元素加一時,需要其相鄰 上下左右 某乙個元素也加一,現給出一正數矩陣,判斷其是否能夠由乙個全零矩陣經過上述運算得到。輸入 輸出 如果可以變換得到輸出 yes 否則 no 存在多組資料,每組資料第一行乙個正整數n n 10 表示乙個n n的矩陣,然...

交叉編譯busybox 1 25 0

系統環境 1 作業系統 ubuntu16.04 2 交叉編譯工具鏈 arm linux gcc4.4.3 3 busybox原始碼包 busybox 1.25.0 一 修改makefile配置 首先解壓原始碼包 tar jxvf busybox 1.25.0.tar.bz2 進入busybox 1....

HDU1250 大整數問題

按照大整數的模版來 這個型別的斐波納數列是前四項和,那麼我們就講其稱為s1,s2,s3,s4,那麼四項和即為s1 s2與s3 s4的和 運用乙個知識點,就是二維陣列str n m 的第i行的起始位址為str i 如下 include includeint f 7061 550 c 550 7060時...