鱼C论坛

 找回密码
 立即注册
查看: 4792|回复: 6

一个二维数组只有 0 和1 怎么求被1 包围的0 的个数

[复制链接]
发表于 2018-10-10 11:31:33 | 显示全部楼层 |阅读模式

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

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

x
下面表里面的0的个数是 4    被包围的部分有两个  一个是单独的0  另外一个是5个0 但是要+1再除2 = 3 所以总共是  4 个零
大神们有什么思路吗
08614e39c39c7d524a006996305aff2.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-10-10 11:48:14 | 显示全部楼层
将0和0连接,
添加0,0连接组
将组添加进一个列表
对列表里每个组里的每个0周围含有不是0,1的进行去除

至于你的什么加几除几的运算,按你自己理解做
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-10 13:13:42 | 显示全部楼层
呃,题目没读太懂,什么叫 0 的个数是4,
不过我想,这个题能不能把他变为 矩阵 i  j   表示位置
然后从 矩阵 0,0 开始 遍历   ,一共四个 方向   (1,0)( 0,1)   (-1,0)  (0,-1),不回头,下一步为1,位置(i, j)加入放弃列表,返回上一步接着走,  遍历如果到边界就  把 这串零的(i,j) 加入放弃列表,如果在放弃列表中的元素,就不再遍历,如果是找到一串被1包围的0就把(i,j)加入保存列表    想知道有几个零就len()一下 ,然后再加入放弃列表,直到放弃列表里面的个数和矩阵元素个数相等退出,不再遍历
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-10 14:04:23 | 显示全部楼层
可以把这个数组发上来吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-10 14:52:32 | 显示全部楼层
你是说1和0互相抵消,然后求图里面还剩下几个吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-10 16:20:00 | 显示全部楼层
  1. L=[
  2. [0,0,1,0,1,0,1,1,1,0,1,0,1,1,1,0,0,0,1,0,1,0,1],
  3. [0,0,1,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,1,0,1],
  4. [1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1],
  5. [1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,1],
  6. [1,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1,1,1,0,1],
  7. [1,0,0,0,0,0,1,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,1],
  8. [1,1,1,1,1,0,1,1,1,0,1,0,1,0,1,1,1,0,1,1,1,1,1],
  9. [1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,1,1,0,1,0,1,0,0],
  10. [1,0,0,0,1,1,1,0,1,0,1,0,1,1,1,1,1,0,1,0,1,0,0]]

  11. Points=[]
  12. I=len(L)
  13. J=len(L[0])



  14. def connect(i,j):
  15.     if L[i][j]==0:
  16.         L[i][j]=3
  17.         group.append((i,j))
  18.         if i>0:
  19.             if L[i-1][j]==0:
  20.                 connect(i-1,j)
  21.         if i<I-1:
  22.             if L[i+1][j]==0:
  23.                 connect(i+1,j)
  24.         if j>0:
  25.             if L[i][j-1]==0:
  26.                 connect(i,j-1)
  27.         if j<J-1:
  28.             if L[i][j+1]==0:
  29.                 connect(i,j+1)

  30. Groups=[]
  31. for i in range(I):
  32.     for j in range(J):
  33.         group=[]
  34.         if L[i][j]==0:
  35.             connect(i,j)
  36.         if group:
  37.             Groups.append(group[:])
  38. result=[]
  39. for eachgroup in Groups:
  40.     for each in eachgroup:
  41.         if not each[0] or not each[1] or each[0]==I-1 or each[1]==J-1:
  42.             break
  43.     else:
  44.         result.append(len(eachgroup))
  45. print(*result)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-10 18:44:42 | 显示全部楼层
最近迷宫游戏很火呦~ 连同路径跟迷宫本质上没有差别
不是很清楚你后面要算什么东西,不过这代码把全部 0 被包围的个数都数出来了
  1. maze = [[0,0,1,0,1,0,1,1,1,0,1,0,1,1,1,0,0,0,1,0,1,0,1],
  2.         [0,0,1,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,1,0,1],
  3.         [1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1],
  4.         [1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,1],
  5.         [1,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1,1,1,0,1],
  6.         [1,0,0,0,0,0,1,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,1],
  7.         [1,1,1,1,1,0,1,1,1,0,1,0,1,0,1,1,1,0,1,1,1,1,1],
  8.         [1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0],
  9.         [1,0,0,0,1,1,1,0,1,0,1,0,1,1,1,0,1,0,1,0,1,0,0]]

  10. for each in maze:
  11.     print(each)
  12. print()

  13. def countZeros():
  14.     Row = len(maze)
  15.     Col = len(maze[0])
  16.     maze2 = []
  17.     marked = 'X'
  18.     for each in maze:
  19.         maze2.append(each[:])
  20.     counts = 1
  21.     def countingZeros(x, y):
  22.         nonlocal maze2
  23.         nonlocal counts
  24.         maze2[x][y] = marked
  25.         
  26.         move_x = [1,0,-1,0]
  27.         move_y = [0,1,0,-1]

  28.         for i in range(4):
  29.             x1 = x + move_x[i]
  30.             y1 = y + move_y[i]

  31.             if(y1 >= 0 and y1 < Col and x1 >= 0 and x1 < Row):
  32.                 if(maze2[x1][y1] == 1 or maze2[x1][y1] == marked):
  33.                     continue
  34.                 maze2[x1][y1] = marked
  35.                 counts += 1
  36.                 countingZeros(x1,y1)

  37.     for y in range(Col):
  38.         for x in range(Row):
  39.             if maze2[x][y] == marked or maze2[x][y] == 1 :
  40.                 continue
  41.             countingZeros(x,y)
  42.             print("({:2d}, {:2d}) has {:2d} connected component(s)".format(x,y,counts))
  43.             counts = 1
  44. ##    print()
  45. ##    for each in maze2:    #打印副本迷宫
  46. ##        for each1 in each:
  47. ##            print("{}".format(each1), end = " ")
  48. ##        print()
  49.             
  50. countZeros()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-16 09:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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