【題目描述】
一座城堡被分成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時...