[leetcode 463]島嶼的周長

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章