[英]Number of Edges
给你一个网格; 有n
行; 和m
列; 如果两个单元格被称为相邻,则它们有共同的一面。
让两个相邻的单元格是a
和b
。 因为它们是相邻的; 因此; 你可以 go 从a
到b
; 以及从b
到a
。
在图论方面; 我们可以说,如果网格被建模为有向图; 那么,存在从a
到b
的有向边; 还有a
从b
到; 如果单元格a
和b
相邻。
你被要求找出图中有向边的数量。
输入格式
输入的第一行包含单个 integer T
; 表示测试用例的数量。
然后; 接下来是t
行; 其中每行包含两个空格分隔的整数n
和m
; 网格的尺寸分别。
样本输入 0
1
3 3
样品 Output 0
24
解释 0
有向边数为 24。
这种方法正确吗? 我的代码确实通过了示例测试用例,但其他人却失败了
def compute(m,n):
arr = [[0 for x in range(n)] for y in range(m)]
arr[0][0]=2
arr[n-1][m-1]=2
arr[0][m-1]=2
arr[n-1][0]=2
for i in range (1,m-1):
arr[i][0]=3
arr[i][n-1]=3
for j in range (1,n-1):
arr[0][j]=3
arr[n-1][j]=3
for i in range (1,n-2):
for j in range (1,m-2):
arr[i][j]=4
return sum(sum(arr,[])) +4
请解释这个问题的正确方法。在此先感谢
我认为你可以用动态编程来解决这个问题。
number of edge in m*n = number of edge in (m-1)*(n) + to_be_calculated
然后你可以简单地找到to_be_calculated
by 2*n + 2*(n-1)
完成列并达到m == 1
后,您可以将n
减少到1
。
def compute(n,m,sum):
if n == 1 and m == 1:
return sum
elif m == 1:
return compute(1, 1, sum + 2*(n-1))
else:
return compute(n, m-1, sum + 2*n + 2*(n-1) )
compute(5,5,0) # For table 5x5
对于 n 行 m 列的网格:任何一行的边数是 m-1,任何一列的边数是 n-1。 在相邻单元格的图中,每一边都有两条边。
因此,n*m 网格的边数为:
def compute(n, m):
return n * (m - 1) * 2 + m * (n - 1) * 2
或者,进一步简化:
def compute(n, m):
return 4 * n * m - 2 * n - 2 * m
您的算法会填充各个边以在最后对它们求和,这比在没有额外约束的情况下解决此问题所需的复杂得多。
您可以找到一个公式来计算图中的边数,如下所示:假设我们有一个尺寸为 n和m的网格。 对于每个单元,我们需要计算相邻单元的数量。 那么,这些数字的总和就是边的数量。
案例 1)这样的网格有4 个角单元,每个角单元有2 个邻居; 总邻居案例 1:4*2= 8
情况 2:这样的网格在其边上有2(n+m-2)-4 个单元格,不包括每个有 3 个邻居的角,总共邻居情况 2: (2 (n+m-2)-4) 3
案例 3)这样的网格有nm-(2(n+m-2)-4)-4 个内部单元格,每个单元格有4 个邻居,总共邻居案例 3:* (nm-(2(n+m-2)-4 )-4) 4
总边数 = 案例 1 + 案例 2 + 案例 3 = 8 + (2(n+m-2)-4)3 + (nm-(2(n+m-2)-4)-4)4 = 4nm - 2(n+m)
因此,您可以使用下面的代码来计算边数:
def compute_total_edges(m,n):
return 4*n*m-2*(n+m)
print(compute_total_edges(3,3))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.