給定一個包含 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