题目描述:
某石油勘探公司正在按计划勘探地下油田资源,工作在一片长方形的地域中。他们首先将该地域划分为许多小正方形区域,然后使用探测设备分别探测每一块小正方形区域内是否有油。
含有油的地块称为油田。如果两个油田相邻,则它们是相同油藏的一部分。油藏可能非常大并且可能包含许多油田。您的工作是确定长方形的地域中包含多少不同的油藏。
文件包含一个或多个网格。每个网格以包含m和n的行开始,n是数字
网格中的行和列,用一个空格隔开。如果m = 0,表示输入结束;
否则,1≤m≤100,1≤n≤100。接下来是m行,每行n个字符(不包括在内)
行尾字符)。“*” 代表没有油, “@”:表示油藏。
对于每个网格,输出不同的石油储量的数量。两个不同的油藏是同一个油田的一部分,水平、垂直或对角线上相邻的油田。石油矿床将包含不超过100多个油藏。
1 1 * 3 5 *@*@* **@** *@*@* 1 8 @@****@* 5 5 ****@ *@@*@ *@**@ @@@*@ @@**@ 0 0
0 1 2 2
用DFS找连通块,从每个“@”格子出发,递归遍历它周围的“@”格子。图的DFS遍历用递归实现。
代码如下:
global m,n,idx,pic
m,n=(int(x) for x in input().split(' '))
idx=[]
pic=[]
def dfs(r,c):
if (r<0 or r>=m) or (c<0 or c>=n):
return
if idx[r][c]>0 or pic[r][c]!='@':
return
idx[r][c]=1
for i in range(-1,2):
for j in range(-1,2):
if i!=0 or j!=0:
dfs(r+i,c+j)
while m!=0:
for a in range(m):
l1=[x for x in str(input())]
pic.append(l1)
for i in range(m):
l2=[]
for j in range(n):
l2.append(0)
idx.append(l2)
count=0
for b in range(m):
for d in range(n):
if idx[b][d]==0 and pic[b][d]=='@':
dfs(b,d)
count+=1
print('%d'%count)
m,n=(int(x) for x in input().split(' '))
idx=[]
pic=[]
运行结果: