簡體   English   中英

邊數

[英]Number of Edges

給你一個網格; n行; m列; 如果兩個單元格被稱為相鄰,則它們有共同的一面。

讓兩個相鄰的單元格是ab 因為它們是相鄰的; 因此; 你可以 go 從ab ; 以及從ba

在圖論方面; 我們可以說,如果網格被建模為有向圖; 那么,存在從ab的有向邊; 還有ab到; 如果單元格ab相鄰。

你被要求找出圖中有向邊的數量。

輸入格式

輸入的第一行包含單個 integer T 表示測試用例的數量。

然后; 接下來是t行; 其中每行包含兩個空格分隔的整數nm 網格的尺寸分別。

樣本輸入 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

您的算法會填充各個邊以在最后對它們求和,這比在沒有額外約束的情況下解決此問題所需的復雜得多。

您可以找到一個公式來計算圖中的邊數,如下所示:假設我們有一個尺寸為 nm的網格。 對於每個單元,我們需要計算相鄰單元的數量。 那么,這些數字的總和就是邊的數量。

案例 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM