鱼C论坛

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

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

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

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

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

x
下面表里面的0的个数是 4    被包围的部分有两个  一个是单独的0  另外一个是5个0 但是要+1再除2 = 3 所以总共是  4 个零
大神们有什么思路吗
08614e39c39c7d524a006996305aff2.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

至于你的什么加几除几的运算,按你自己理解做
想知道小甲鱼最近在做啥?请访问 -> 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()一下 ,然后再加入放弃列表,直到放弃列表里面的个数和矩阵元素个数相等退出,不再遍历
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-10 14:04:23 | 显示全部楼层
可以把这个数组发上来吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-10 14:52:32 | 显示全部楼层
你是说1和0互相抵消,然后求图里面还剩下几个吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-10 16:20:00 | 显示全部楼层
L=[
[0,0,1,0,1,0,1,1,1,0,1,0,1,1,1,0,0,0,1,0,1,0,1],
[0,0,1,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,1,0,1],
[1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1],
[1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,1],
[1,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1,1,1,0,1],
[1,0,0,0,0,0,1,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,1],
[1,1,1,1,1,0,1,1,1,0,1,0,1,0,1,1,1,0,1,1,1,1,1],
[1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,1,1,0,1,0,1,0,0],
[1,0,0,0,1,1,1,0,1,0,1,0,1,1,1,1,1,0,1,0,1,0,0]]

Points=[]
I=len(L)
J=len(L[0])



def connect(i,j):
    if L[i][j]==0:
        L[i][j]=3
        group.append((i,j))
        if i>0:
            if L[i-1][j]==0:
                connect(i-1,j)
        if i<I-1:
            if L[i+1][j]==0:
                connect(i+1,j)
        if j>0:
            if L[i][j-1]==0:
                connect(i,j-1)
        if j<J-1:
            if L[i][j+1]==0:
                connect(i,j+1)

Groups=[]
for i in range(I):
    for j in range(J):
        group=[]
        if L[i][j]==0:
            connect(i,j)
        if group:
            Groups.append(group[:])
result=[]
for eachgroup in Groups:
    for each in eachgroup:
        if not each[0] or not each[1] or each[0]==I-1 or each[1]==J-1:
            break
    else:
        result.append(len(eachgroup))
print(*result)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

for each in maze:
    print(each)
print()

def countZeros():
    Row = len(maze)
    Col = len(maze[0])
    maze2 = []
    marked = 'X'
    for each in maze:
        maze2.append(each[:])
    counts = 1
    def countingZeros(x, y):
        nonlocal maze2
        nonlocal counts
        maze2[x][y] = marked
        
        move_x = [1,0,-1,0]
        move_y = [0,1,0,-1]

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

            if(y1 >= 0 and y1 < Col and x1 >= 0 and x1 < Row):
                if(maze2[x1][y1] == 1 or maze2[x1][y1] == marked):
                    continue
                maze2[x1][y1] = marked
                counts += 1
                countingZeros(x1,y1)

    for y in range(Col):
        for x in range(Row):
            if maze2[x][y] == marked or maze2[x][y] == 1 :
                continue
            countingZeros(x,y)
            print("({:2d}, {:2d}) has {:2d} connected component(s)".format(x,y,counts))
            counts = 1
##    print()
##    for each in maze2:    #打印副本迷宫
##        for each1 in each:
##            print("{}".format(each1), end = " ")
##        print()
            
countZeros()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-7 07:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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