Algorithm 计算1'的边数;它与0共享的矩阵中的
我们有一个包含0和1的矩阵 类似于岛的数量问题 我需要找出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共
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是的,它可以做得更快。我知道这一点,因为我对您的代码进行了反向工程,以确定输入格式。答案只能和你写的问题一样好。下一次,花更多的精力去解释你要解决的问题。