Algorithm 计算1'的边数;它与0共享的矩阵中的

Algorithm 计算1'的边数;它与0共享的矩阵中的,algorithm,matrix,graph,depth-first-search,Algorithm,Matrix,Graph,Depth First Search,我们有一个包含0和1的矩阵 类似于岛的数量问题 我需要找出1与0和外部世界(即矩阵的边界)共享的总边(左、右、上、下) 例如: 1 0 1 0 0 1 1 1 0 1 0 1 0 0 0 1 0 0 0 0 所以,14+4+4=22 第一组14名 其他2组4例 我们需要找出岛与0或矩阵边界接触的长度。 在示例中,有3个岛,其中两个岛是单岛1。所以它们接触到0和矩阵边界的四条边(上、下、右、左)。 第三个岛由6个1组成,将4条边中的所有1条边相加,1与0共

我们有一个包含0和1的矩阵

类似于岛的数量问题

我需要找出1与0和外部世界(即矩阵的边界)共享的总边(左、右、上、下)

例如:

     1 0 1 0 0
     1 1 1 0 1
     0 1 0 0 0
     1 0 0 0 0
所以,14+4+4=22

第一组14名

其他2组4例

我们需要找出岛与0或矩阵边界接触的长度。 在示例中,有3个岛,其中两个岛是单岛1。所以它们接触到0和矩阵边界的四条边(上、下、右、左)。 第三个岛由6个1组成,将4条边中的所有1条边相加,1与0共用,矩阵边界为14

这是我的密码

class graphe:
def __init__(self,row,col,g):
    self.row=row
    self.col=col
    self.graph=g

def valid(self,i,j):
    return (i>=0 and i < self.row and j>=0 and j< self.col )


def dfs(self,t):
    r = [0,0,1,-1]
    c = [1,-1,0,0]
    total = 0
    for ii in t:
        i = ii[0]
        j = ii[1]
        for k in range(4):
            if self.valid(i+r[k],j+c[k]):
                if self.graph[i+r[k]][j+c[k]] == 0:
                    total += 1
            else:
                total += 1
    return total


for _ in range(int(input())):
    n,m,k = map(int,input().split())
    graph = [ [0 for i in range(m)] for j in range(n)]
    t = []
    for i in range(k):
        a,b = map(int,input().split())
        graph[a-1][b-1] = 1
        t.append([a-1,b-1])

    g = graphe(n,m,graph)

    print(g.dfs(t))
类图表:
定义初始化(self、row、col、g):
self.row=行
self.col=col
self.graph=g
def有效(自身、i、j):
返回(i>=0和i=0和j
您需要为矩阵中的每一行和每一列计算从0到1和从1到0的变化

矩阵的边可以计为零。 对于第0行,我们有0=>1=>0=>1=>0的更改。4变化

对于第2列,我们有0=>1=>0的更改。2个变化


将所有更改(交叉)计算在一起,您就完成了。

您不必担心分组。只需分别分析每个1。我需要减少时间。我应用了简单的bfs,并检查了所有4个相邻的地方,但这花费了太多的时间。你能试着更好地解释你想要什么,或者给出支持材料的链接吗。我不知道你想达到什么目的。首先我们需要找出孤岛的数量,以及1形成的单个孤岛,它们要么上下相连,要么左右相连。没有对角线连接是有效的。因此,当我们发现这样一个岛屿时,我们需要在其周围划定边界。所以边界的总长度。如果我们把细胞的一侧作为单位,欢迎来到这里。A.“例如:(1,1)处的1与0共用一个边,1与1共用一个边,2与矩阵边界共用一个边。”这一点很清楚。您试图计算的内容不清楚。B.在报告中添加解释,而不是作为评论。C.“我应用了简单的bfs并检查了所有4个相邻的位置,但这花费了太多的时间”将您的代码发布为。这应该不会花太多时间。如果这可以通过其他方式实现的话。我想到的是线性时间解或小于O(nm)的时间。喜欢有向图的强连通成分,如果可以发展一些逻辑。@Jagan_uuu是的,它可以做得更快。我知道这一点,因为我对您的代码进行了反向工程,以确定输入格式。答案只能和你写的问题一样好。下一次,花更多的精力去解释你要解决的问题。