给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域。
网格中的格子水平和垂直方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。
岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。
示例 :
输入:
[[0,1,0,0],
[1,1,1,0],
[0,1,0,0],
[1,1,0,0]]
输出: 16
解释: 它的周长是下面图片中的 16 个黄色的边:
class Solution(object):
def islandPerimeter(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
L=[]
m=len(grid)#行数
n=len(grid[0])#列数
if m==1 and n==1:
return 4
for i in range(0,len(grid)):
for j in range(0,len(grid[i])):
#ans=4
if grid[i][j]==1:
ans=0
if (i>=1 and j>=1) and (i<m-1 and j<n-1):
# ans=4
if grid[i][j-1]==0:#左
ans=ans+1
if grid[i][j+1]==0:#右
ans=ans+1
if grid[i-1][j]==0:#上
ans=ans+1
if grid[i+1][j]==0:#下
ans=ans+1
elif i==0 and j==0 and i<m-1 and j<n-1:#左上角
ans=2
if grid[i][j+1]==0:#右
ans=ans+1
if grid[i+1][j]==0:#下
ans=ans+1
elif i==0 and j==n-1 and i<m-1 and j>0:#右上角
ans=2
if grid[i][j-1]==0: #左
ans=ans+1
if grid[i+1][j]==0:#下
ans=ans+1
elif i==m-1 and j==0 and j<n-1 and i>0: #左下角
ans=2
if grid[i][j+1]==0:#右
ans=ans+1
if grid[i-1][j]==0:#上
ans=ans+1
elif i==m-1 and j==n-1 and i>0 and j>0:#右下角
ans=2
if grid[i][j-1]==0: #左
ans=ans+1
if grid[i-1][j]==0:#上
ans=ans+1
elif (i>=1 and i <m-1) and j==0 and j<n-1:#左中
ans=1
if grid[i][j+1]==0:#左
ans=ans+1
if grid[i+1][j]==0:#下
ans=ans+1
if grid[i-1][j]==0:#左
ans=ans+1
elif (i>=1 and i <m-1) and j==n-1 and j>0:#右中
ans=1
if grid[i+1][j]==0:#左
ans=ans+1
if grid[i-1][j]==0:#上
ans=ans+1
if grid[i][j-1]==0:#左
ans=ans+1
elif (j>=1 and j<n-1) and i==m-1 and i>0:#中下
ans=1
if grid[i][j-1]==0:#左
ans=ans+1
if grid[i-1][j]==0:#上
ans=ans+1
if grid[i][j+1]==0:#左
ans=ans+1
# (j>=1 and j<n-1) and i==0:#中上
elif(i==0 and j==0) and(i==m-1 and j<n-1): #左上角
ans=3
# print(ok)
if grid[i][j+1]==0:
ans=ans+1
elif i==0 and (i==m-1 and j==n-1):#左上角
ans=3
if grid[i][j-1]==0:
ans=ans+1
elif (i==0 and j==0) and (i<m-1 and j==n-1):#左上角
ans=3
if grid[i+1][j]==0:
ans=ans+1
elif j==0 and (i==m-1 and j==n-1):#左上角
ans=3
if grid[i-1][j]==0:
ans=ans+1
elif i==m-1 and i==0 and j>0 and j<n-1:#左上角
ans=2
if grid[i][j+1]==0:
ans=ans+1
if grid[i][j-1]==0:
ans=ans+1
elif j==n-1 and j==0 and i>0 and i<m-1:#左上角
ans=2
if grid[i+1][j]==0:
ans=ans+1
if grid[i-1][j]==0:
ans=ans+1
else:
ans=1
if grid[i][j-1]==0: #左
ans=ans+1
if grid[i+1][j]==0:#下
ans=ans+1
if grid[i][j+1]==0:#左
ans=ans+1
L.append(ans)
s=0
print(L)
for x in L:
s=s+x
# print(s)
#print(len(L))
return s
哇 这道题很简单 但是用模拟的办法讨论很多种情况真的十分令人头大 几乎是看着样例改代码 看评论 看到了一种很简单的方式:
对于每个方块来说,损失的就是两个1连在一起时的两条边。所以纵横遍历就可以找到损失了多少边。
class Solution(object):
def islandPerimeter(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
count=0
count1=0
for i in range(0,len(grid)):
for j in range(0,len(grid[0])):
if grid[i][j]==1:
count=count+1
#竖着扫描交集
for i in range(0,len(grid)-1):
for j in range(0,len(grid[0])):
if grid[i][j] and grid[i+1][j] :
count1=count1+1
#横着扫描
for i in range(0,len(grid)):
for j in range(0,len(grid[0])-1):
if grid[i][j] and grid[i][j+1] :
count1=count1+1
return 4*count-2*count1