鱼C论坛

 找回密码
 立即注册
查看: 3931|回复: 27

Python:每日一题 389

[复制链接]
发表于 2020-5-2 14:14:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
今天的题目:


给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地,0 表示水域。

网格中的格子水平和垂直方向相连(但对角线方向不相连)。

整个网格被水完全包围,但其中恰好有一个岛屿(或者说一个或多个表示陆地的格子相连组成的岛屿)。

格子是边长为 1 的正方形,网格为长方形。计算这个岛屿的周长。

说明:1. 岛屿中没有 “湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。
2. 网格的长度和高度均不超过 100 。

示例:

输入:
[
[0, 1, 0, 0],
[1, 1, 1, 0],
[0, 1, 0, 0],
[1, 1, 0, 0]
]
输出:16
解释:它的周长是下面图片中的 16 个黄色的边:

1.png


欢迎大家一起答题!

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-2 14:39:57 | 显示全部楼层
本帖最后由 TJBEST 于 2020-5-2 21:19 编辑
  1. def fun389(grid):
  2.    
  3.     if len(grid) == 1:
  4.         return 2*sum(grid[0])+2
  5.    
  6.     result = 0#结果   
  7.     has = 0#标志 表示已经进入岛屿
  8.     temp = 0#每行周长
  9.     M = len(grid)
  10.     N = len(grid[0])
  11.     #Line 0
  12.     if grid[0][0] == 1:
  13.         temp += 4 - (grid[0][1] + grid[1][0])
  14.     for j in range(1,N-1):
  15.         if grid[0][j] == 1:
  16.             temp += 4 - (grid[0][j-1] + grid[0][j+1] + grid[1][j])
  17.     if grid[0][N-1] == 1:
  18.         temp += 4 - (grid[0][N-2] + grid[1][N-1])
  19.     if temp > 0:
  20.         has = 1
  21.         result += temp
  22.     #Line 1 ~ M-2
  23.     for i in range(1,M-1):
  24.         temp = 0
  25.         if grid[i][0] == 1:
  26.             temp += 4 - (grid[i-1][0] + grid[i+1][0] + grid[i][1])
  27.         for j in range(1,N-1):
  28.             if grid[i][j] == 1:
  29.                 temp += 4 - (grid[i-1][j] + grid[i+1][j] + grid[i][j-1] + grid[i][j+1])
  30.         if grid[i][N-1] == 1:
  31.             temp += 4 - (grid[i][N-2] + grid[i-1][N-1] + grid[i+1][N-1])
  32.         if temp > 0:
  33.             has = 1
  34.             result += temp
  35.         else:
  36.             if has > 0:
  37.                 break
  38.             else:
  39.                 pass
  40.     #Line M-1 前面直接跳出无所谓 就是多算一行而行
  41.     temp = 0
  42.     if grid[M-1][0] == 1:
  43.         temp += 4 - (grid[M-2][0] + grid[M-1][1])
  44.     for j in range(1,N-1):
  45.         if grid[M-1][j] == 1:
  46.             temp += 4 - (grid[M-1][j-1] + grid[M-1][j+1] + grid[M-2][j])
  47.     if grid[M-1][N-1] == 1:
  48.         temp += 4 - (grid[M-1][N-2] + grid[M-2][N-1])
  49.     result += temp
  50.     return result
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-2 14:40:15 | 显示全部楼层
占楼
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-2 14:47:45 | 显示全部楼层
本帖最后由 Twilight6 于 2020-5-2 14:55 编辑

占楼~


。。。放弃,这题我不会
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-2 15:40:03 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-2 16:14:51 | 显示全部楼层
本帖最后由 xiangjianshinan 于 2020-5-2 20:09 编辑

我愚钝,再仔细研究下题目!!!

pandas 还不会用,否则就是几句代码的问题吧??

  1. import pandas as pd
  2. def timu389(l):
  3.     la = pd.DataFrame(l)
  4.     jishu,sa = 0,sum(la.sum(1))*4
  5.     for i in range(la.shape[0]):
  6.         for j in range(la.shape[1]):
  7.             if (i > 0 and la[i-1][j] and la[i][j]):
  8.                 jishu += 1
  9.             if (j > 0 and la[i][j-1] and la[i][j]):
  10.                 jishu += 1
  11.     return sa-jishu*2

  12. la = [
  13. [0, 1, 0, 0],
  14. [1, 1, 1, 0],
  15. [0, 1, 0, 0],
  16. [1, 1, 0, 0]
  17. ]
  18. print(timu389(la))
复制代码


另:这里pandas几乎或者根本没有用到。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-2 17:43:46 From FishC Mobile | 显示全部楼层
本帖最后由 kinkon 于 2020-5-2 23:23 编辑
  1. def f389(grid):
  2.     if not grid or not grid[0]:
  3.         return 0
  4.     m, n = len(grid), len(grid[0])
  5.     ans = [(-1,0),(0,-1),(1,0),(0,1)]
  6.     cout = 0
  7.     for i in range(m):
  8.         for j in range(n):
  9.             if grid[i][j] == 1:
  10.                 cout += 4
  11.                 for k, v in ans:
  12.                     if 0 <= i+k < m and 0 <= j+v < n:
  13.                         if grid[i+k][j+v] == 1:
  14.                             cout -= 1
  15.                         
  16.     return cout
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-2 17:45:16 | 显示全部楼层
本帖最后由 悠悠2264 于 2020-5-2 18:32 编辑

运用深度优先搜索,由于需要用到递归,所以封装了两个函数。
  1. def dfs(x,y):
  2.     global num
  3.     global book
  4.     book[x][y] = 1
  5.     num = num + 4
  6.     if x+1 < len(l) and l[x+1][y] == 1:
  7.         num = num - 1
  8.         if book[x+1][y] == 0:
  9.             dfs(x+1,y)
  10.     if y+1 < len(l[x]) and l[x][y+1] == 1:
  11.         num = num - 1
  12.         if book[x][y+1] == 0:
  13.             dfs(x,y+1)
  14.     if x-1 >= 0 and l[x-1][y] == 1:
  15.         num = num - 1
  16.         if book[x-1][y] == 0:
  17.             dfs(x-1,y)
  18.     if y-1 >= 0 and l[x][y-1] == 1:
  19.         num = num - 1
  20.         if book[x][y-1] == 0:
  21.             dfs(x,y-1)
  22.     return
  23. def day389(list1):
  24.     global num
  25.     num = 0
  26.     global book
  27.     book = []
  28.     global l
  29.     l = list1
  30.     for i in range(len(l)):
  31.         t = []
  32.         for j in range(len(l[i])):
  33.             t.append(0)
  34.         book.append(t)
  35.     for i in range(len(l)):
  36.         for j in range(len(l[i])):
  37.             if l[i][j] == 1:
  38.                 dfs(i,j)
  39.                 return num
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-2 18:06:13 | 显示全部楼层
本帖最后由 liuzhengyuan 于 2020-5-12 09:39 编辑

我在力扣上测了一下(通过了)
  1. class Solution:
  2.     def islandPerimeter(self, grid: List[List[int]]) -> int:
  3.         # 思路:横向纵向暴力……
  4.         # 在各个边的的结尾部分插入 0,以便之后使用暴力……
  5.         for i in range(len(grid)):
  6.                 grid[i].append(0)
  7.         templist = []
  8.         for i in range(len(grid[0])):
  9.                 templist.append(0)
  10.         grid.append(templist)

  11.         # 暴力
  12.         sides = 0
  13.         for i in grid:
  14.                 panb = False
  15.                 for j in i:
  16.                         if panb != j:
  17.                                 sides += 1
  18.                                 panb = j

  19.         for i in range(len(grid[0])):
  20.                 panb = False
  21.                 for j in range(len(grid)):
  22.                         if panb != grid[j][i]:
  23.                                 sides += 1
  24.                                 panb = grid[j][i]
  25.         return sides
复制代码
  1. def d389(list1):
  2.         # 思路:横向纵向暴力……
  3.         # 在各个边的的结尾部分插入 0,以便之后使用暴力……
  4.         for i in range(len(list1)):
  5.                 list1[i].append(0)
  6.         templist = []
  7.         for i in range(len(list1[0])):
  8.                 templist.append(0)
  9.         list1.append(templist)

  10.         # 暴力
  11.         sides = 0
  12.         for i in list1:
  13.                 panb = False
  14.                 for j in i:
  15.                         if panb != j:
  16.                                 sides += 1
  17.                                 panb = j

  18.         for i in range(len(list1[0])):
  19.                 panb = False
  20.                 for j in range(len(list1)):
  21.                         if panb != list1[j][i]:
  22.                                 sides += 1
  23.                                 panb = list1[j][i]
  24.         return sides
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-2 19:59:16 | 显示全部楼层
  1. def daily389(grid: list) -> int:
  2.     # 解题思路
  3.     # 岛的解题方法一般会用DFS(但这里好像没必要)
  4.     # 说明中特别指出没有湖(这不就是告诉我们要偷懒吗) -> 只需要求北边和西边的长度
  5.     # 南边长度等于北边,东边长度等于西边
  6.     row = len(grid)
  7.     column = len(grid[0])
  8.     c = 0
  9.     for i in range(row):
  10.         for j in range(column):
  11.             if grid[i][j] == 1:
  12.                 if i == 0 or grid[i - 1][j] == 0:
  13.                     c += 1
  14.                 if j == 0 or grid[i][j - 1] == 0:
  15.                     c += 1
  16.     return c * 2
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-2 20:01:38 | 显示全部楼层
xiangjianshinan 发表于 2020-5-2 16:14
我愚钝,再仔细研究下题目!!!

pandas 还不会用,否则就是几句代码的问题吧??

哈哈哈,和我的思路好像
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-2 20:21:32 | 显示全部楼层
March2615 发表于 2020-5-2 20:01
哈哈哈,和我的思路好像

很遗憾哦,我感觉看别人的代码很累。看不懂思路,也不想看!!!我知道这样不对的,不利于我技术水平地提高。。。

求问,有秘诀吗?


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-2 22:22:46 | 显示全部楼层
  1. def f(list1):
  2.     for n in range(len(list1)):
  3.         if 1 in list1[n]:
  4.             break
  5.     m = n
  6.     length = (list1[n]).count(1)
  7.     while 1 in list1[n] and n+1<len(list1):
  8.         n += 1
  9.         for each in range(len(list1[n])):
  10.             if list1[n][each] == 1 and list1[n-1][each] ==0:
  11.                 length += 1
  12.     return (length+n-m+1)*2
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-3 00:06:46 | 显示全部楼层
  1. def fun389(lst):
  2.     result=0
  3.     for i in range(len(lst)):
  4.         lst[i].insert(0,0)
  5.         lst[i].append(0)
  6.     lst.insert(0,[0]*len(lst[0]))
  7.     lst.append([0]*len(lst[0]))
  8.     for i in range(1,len(lst)-1):
  9.         for j in range(1,len(lst[0])-1):
  10.             if lst[i][j]:
  11.                 result+=4-lst[i-1][j]-lst[i][j-1]-lst[i+1][j]-lst[i][j+1]
  12.     return result
复制代码

不知道是不是这个意思,但我这个程序运行还是比较慢的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-3 11:17:33 | 显示全部楼层
相当于把矩阵周围加一圈0,原矩阵中每个元素分别向上向左模2加
  1. import numpy as np


  2. def func389(matrix):
  3.     matrix = np.array(matrix)
  4.     row, col = np.shape(matrix)
  5.     circle = 0
  6.     for i in range(row):
  7.         for j in range(col):
  8.             if i == 0 and j == 0:
  9.                 circle += matrix[i][j]
  10.             elif i == 0 and j != 0:
  11.                 circle += (matrix[i][j] + matrix[i][j-1]) % 2 + matrix[i][j]
  12.             elif i != 0 and j == 0:
  13.                 circle += (matrix[i][j] + matrix[i-1][j]) % 2 + matrix[i][j]
  14.             else:
  15.                 circle += (matrix[i][j] + matrix[i-1][j]) % 2 + (matrix[i][j] + matrix[i][j-1]) % 2
  16.     circle = circle + np.sum(matrix[row-1]) + np.sum(matrix[:, col-1])
  17.     return circle
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-3 16:07:02 | 显示全部楼层
  1. def func389(grid):
  2.     count = 0
  3.     subnumber = 0
  4.     m = len(grid)
  5.     n = len(grid[0])
  6.     for i in range(m):
  7.         for j in range(n):
  8.             if grid[i][j] == 1:
  9.                 count +=1
  10.                 if j+1!=n:
  11.                     if grid[i][j+1] == 1:
  12.                         subnumber += 1
  13.                 if i+1!=m:
  14.                     if grid[i+1][j] == 1:
  15.                         subnumber += 1
  16.     return count*4 - subnumber*2
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-4 10:45:08 | 显示全部楼层
def zcd(x,y,list):
    zc = 0    #初始化周长

#判断周边是否与陆地接触
    #左边
    if y == 0:
        zc += 1
    else:
        if list[x][y-1] == 0:
            zc += 1

   #上边
    if x == 0:
        zc += 1
    else:
        if list[x-1][y] == 0:
            zc += 1        
   
    #右边
    if y == 3:
        zc += 1
    else:
        if list[x][y+1] == 0:
            zc += 1     

    #下边
    if x == 3:
        zc += 1
    else:
        if list[x+1][y] == 0:
            zc += 1

    return zc


list = [
[0, 1, 0, 0],
[1, 1, 1, 0],
[0, 1, 0, 0],
[1, 1, 0, 0]
]

s = 0  #初始化总周长

#计算周长
for i in range(4):
    for j in range(4):
        if list[i][j] == 1:
            
            s += zcd(i,j,list)
            


print(s)

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-4 10:59:44 | 显示全部楼层
  1. def zcd(x,y,list):
  2.     zc = 0    #初始化周长

  3. #判断周边是否与陆地接触
  4.     #左边
  5.     if y == 0:
  6.         zc += 1
  7.     else:
  8.         if list[x][y-1] == 0:
  9.             zc += 1

  10.    #上边
  11.     if x == 0:
  12.         zc += 1
  13.     else:
  14.         if list[x-1][y] == 0:
  15.             zc += 1        
  16.    
  17.     #右边
  18.     if y == 3:
  19.         zc += 1
  20.     else:
  21.         if list[x][y+1] == 0:
  22.             zc += 1     

  23.     #下边
  24.     if x == 3:
  25.         zc += 1
  26.     else:
  27.         if list[x+1][y] == 0:
  28.             zc += 1

  29.     return zc


  30. list = [
  31. [0, 1, 0, 0],
  32. [1, 1, 1, 0],
  33. [0, 1, 0, 0],
  34. [1, 1, 0, 0]
  35. ]

  36. s = 0  #初始化总周长

  37. #计算周长
  38. for i in range(4):
  39.     for j in range(4):
  40.         if list[i][j] == 1:
  41.             
  42.             s += zcd(i,j,list)
  43.             


  44. print(s)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-5 00:13:07 | 显示全部楼层
  1. def P389(lit):
  2.     n = 0
  3.     row, column = len(lit), len(lit[0])
  4.     for r in range(row):
  5.         for c in range(column):
  6.             i = 0
  7.             if lit[r][c] == 0:
  8.                 continue
  9.             else:
  10.                 if r != 0 and lit[r-1][c] == 1:
  11.                     i += 1
  12. ##                    print('1:',i,end=' ')
  13.                 if c != 0 and lit[r][c-1] == 1:
  14.                     i += 1
  15. ##                    print('2:',i,end=' ')
  16.                 if r != row - 1 and lit[r+1][c] == 1:
  17.                     i += 1
  18. ##                    print('3:',i,end=' ')
  19.                 if c != column - 1 and lit[r][c+1] == 1:
  20.                     i += 1
  21. ##                    print('4:',i)
  22.                 n += 4-i
  23. ##                print('n:',n)
  24.     return n

  25. lit = [
  26. [0, 1, 0, 0],
  27. [1, 1, 1, 0],
  28. [0, 1, 0, 0],
  29. [1, 1, 0, 0]
  30.     ]

  31. print(P389(lit))
复制代码

萌新求大佬赐教
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-6 05:27:48 | 显示全部楼层
  1. def fun389(lst):
  2.         result = []
  3.         for row in range(len(lst)):
  4.                 for col in range(len(lst[row])):
  5.                         count =[]
  6.                         if lst[row][col] == 1:
  7.                                 count.extend([row, col, row - len(lst[row]) + 1, col - len(lst[col]) + 1])
  8.                                 if row > 0:
  9.                                         count.append(lst[row - 1][col])
  10.                                 if row + 1 < len(lst) - 1:
  11.                                         count.append(lst[row + 1][col])
  12.                                 if col > 0:
  13.                                         count.append(lst[row][col - 1])
  14.                                 if col + 1 < len(lst[row]) - 1:
  15.                                         count.append(lst[row][col + 1])
  16.                                 result.append(count.count(0))
  17.         return sum(result)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-18 18:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表