[英]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.