Python 边数
给你一个网格;具有Python 边数,python,math,Python,Math,给你一个网格;具有n行行;和m列其中两个单元格被称为相邻,如果:它们有一个公共边 让两个相邻的单元格分别为a和b。因为它们是相邻的;因此;您可以从a转到b;以及从b到a 在图论方面;我们可以说,如果网格被建模为一个有向图;然后,存在从a到b的有向边;以及a从b到;如果单元格a和b相邻 要求您查找图形中有向边的数目 输入格式 输入的第一行包含一个整数T;表示测试用例的数量 然后,t后面跟着行;其中每行包含两个空格分隔的整数n和m;网格的尺寸分别为 样本输入0 1 3 3 24 样本输出0 1
n行
行;和m
列其中两个单元格被称为相邻,如果:它们有一个公共边
让两个相邻的单元格分别为a
和b
。因为它们是相邻的;因此;您可以从a
转到b
;以及从b
到a
在图论方面;我们可以说,如果网格被建模为一个有向图;然后,存在从a
到b
的有向边;以及a
从b
到;如果单元格a
和b
相邻
要求您查找图形中有向边的数目
输入格式
输入的第一行包含一个整数T
;表示测试用例的数量
然后,<代码>t后面跟着行;其中每行包含两个空格分隔的整数n
和m
;网格的尺寸分别为
样本输入0
1
3 3
24
样本输出0
1
3 3
24
解释0
1
3 3
24
定向边的数目为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
请解释解决此问题的正确方法。提前感谢我认为您可以使用动态规划解决此问题
m*n中的边数=m-1中的边数)*(n)+待计算的边数
然后,您只需通过2*n+2*(n-1)
完成列操作并达到m==1
后,可以将n
减少到1
def计算(n,m,和):
如果n==1且m==1:
回报金额
elif m==1:
返回计算(1,1,和+2*(n-1))
其他:
返回计算(n,m-1,和+2*n+2*(n-1))
计算表5x5的(5,5,0)#
对于由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个邻居,总邻居案例3:*(nm-(2(n+m-2)-4)4 边缘总数=案例1+案例2+案例3=8+(2(n+m-2)-4)3+(nm-(2(n+m-2)-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))