輸入乙個只包含0和1的二維陣列,上下左右和對角相鄰的1組成乙個區塊,0不形成區塊,求陣列中的區塊個數。
輸入格式
第一行輸入兩個正整數n和m,n表示陣列行數,m表示陣列列數。
接下來n行,每行表示陣列對應的一行,每行包含m個整數,整數之間用空格隔開。
輸出格式
輸出乙個整數,表示陣列中區塊的個數。
資料範圍
0 ≤ n, m, n∗m ≤ 10^6
輸入樣例:
3 30 1 0
1 0 0
1 0 1
輸出樣例:
2樣例解釋
陣列右下角的1單獨構成乙個區塊,其他的3個1對角或上下相鄰,構成另乙個區塊。
思路一: 二維陣列進行 dfs
n,m =
list
(map
(eval
,input()
.split(
' ')))
matrix =
for _ in
range
(n):
matrix +=
input()
.split(
' ')
,
3 3
0 1 0
1 0 0
1 0 1
# 定義上下左右對角線的方位
dx =[-
1,-1
,-1,
0,0,
1,1,
1]dy =[-
1,0,
1,-1
,1,-
1,0,
1]res =
0def
dfs(i, j)
: matrix[i]
[j]=
0for k in
range
(len
(dx)):
x, y = i + dx[k]
, j + dy[k]
if x>=
0and y>=
0and x[y]==
'1':
dfs(x, y)
for i in
range
(n):
for j in
range
(m):
if matrix[i]
[j]==
'1':
res +=
1 dfs(i, j)
print
(res)
2
思路二:由於題目中的矩陣的長寬沒有給定,在 c/c++ 語言中,最好是定義指定大小的陣列,如果存在 10^6 * 10^6 的陣列,會出現爆棧情況,所以這裡有個小技巧,使用一維陣列來儲存題目的二位陣列。
那麼在二維陣列的元素下標為i,j
時,對應的一維陣列元素下標應該是i*m+j
一維陣列的元素下標為k
時,對應的二維陣列元素下標應該是k//m, k%m
n,m =
list
(map
(eval
,input()
.split(
' ')))
matrix =
for _ in
range
(n):
matrix +=
input()
.split(
' ')
3 3
1 1 1
0 1 0
1 0 1
matrix
['1', '1', '1', '0', '1', '0', '1', '0', '1']
res =
0def
dfs(x, y)
: matrix[x * m + y]=0
for i in
range(-
1,2)
:for j in
range(-
1,2)
: a, b = x+i, y+j
if a >=
0and a < n and b >=
0and b < m and matrix[a * m + b]
=='1'
: dfs(a, b)
for i in
range
(n):
for j in
range
(m):
if matrix[i * m + j]
=='1'
: res +=
1 dfs(i, j)
print
(res)
1
位元組跳動筆試題
要求 輸入陣列長度,然後輸入陣列中的各個元素,最後輸入整數k,要求找出陣列中三個元素小於k的三個元素,例如 輸入陣列長度 6 輸入陣列元素 2 0 1 2 3 6 輸出三元組 共4個 下面給出思路和 思路 1 獲得使用者輸入的陣列長度n,若n不為整數,則提示錯誤。2 建立陣列。3 獲得使用者輸入的陣...
位元組跳動筆試題 豆油瓶
位元組跳動 2019筆試題 豆油瓶 mart1nn的部落格 題目 抖音中每兩個使用者之間互動超過3次即互為豆油瓶,若使用者1與使用者2互動超過3次,使用者2又與使用者3互動超過三次,則使用者1與使用者3也為豆油瓶。且使用者不能與自身互動 即a i i 0,i 0,1,2,3 例1 輸入 30 2 4...
2019位元組跳動筆試題
第三題 有n個人參加程式設計比賽,比賽結束後每個人都得到乙個分數,現在所有人排成一圈 第乙個和第n個相鄰 領取獎品,要求 1.現在某個人的分數比左右的人告,那麼獎品數量也比左右的人多 2.每個人至少得到乙個獎品 問最少應該準備多少個獎品?測試用例 n組資料 每組陣列輸入n個人,n個人的分數 輸入 2...