2017-04-18 71 views
0

我寫了一個得分函數正確地評估以下的N×N陣列:有沒有一種更優雅的方式來爲NxN數組編寫分數函數?

int state1[][] = { 
      {0, 1, 0}, 
      {1, 0, 0}, 
      {0, 1, 0} }; // score = 0 

    int state2[][] = { 
      {0, 1, 1}, 
      {1, 0, 0}, 
      {1, 1, 0} }; // score = 2 

    int state3[][] = { 
      {1, 1, 0}, 
      {1, 1, 1}, 
      {1, 0, 0} }; // score = 5 

是否有一個更優雅的(簡單)的方式來寫出下列分數的功能?

public static int score(int[][] s) { 
    int count = 0; 
    int hold = 0; 
    int length = s.length; 
    int end = length - 1; 
    for (int col = 0; col < length; col++) { 
     for (int row = 0; row < length; row++) { 
      hold = s[row][col]; 
      if (row == 0 && hold == 1 && s[row + 1][col] == 1) { 
       count++; 
      } 
      else if (row == end && hold == 1 && s[row - 1][col] == 1) { 
       count++; 
      } 
      else if (row != 0 && row != end && hold == 1 && (s[row + 1][col] == 1 || s[row - 1][col] == 1)) { 
       count++; 
      } 
     } 
    } 
    return count; 
} 

讓我補充一點,得分取決於「1」是否在其上方或下方有另一個「1」。換句話說,如果第1行中有「1」,則在第0行或第2行中同一列中存在「1」的情況下,得分遞增。

+0

描述什麼功能呢? – Justas

+1

codereview.stackexchange.com是一個更好的地方尋求幫助改善工作代碼。 – GER

回答

0

我懷疑這會做同樣的事情 - 進行測試:

if (hold == 1) { 
    boolean hasOneAbove = row > 0 && s[row - 1][col] == 1; 
    boolean hasOneBelow = row < end && s[row + 1][col] == 1; 
    if (hasOneAbove || hasOneBelow) count++; 
} 
+0

Yepper,這段代碼可以代替我的if-else-if塊。當然,事後看來,與我的迂迴代碼相比,這在邏輯上是直截了當的。我只需要更多的練習,以便我可以更輕鬆地識別類似的策略。 – TheWink

0

這也應該這樣做:

public static int score(int[][] s) { 
    int count = 0; 
    final int end = s.length - 1; 
    for (int col = 0; col <= end; col++) 
     for (int row = 0; row <= end; row++) 
      if (s[row][col] == 1) 
       if ((row != end && s[row + 1][col] == 1) || (row != 0 && s[row - 1][col] == 1)) 
        count++; 
    return count; 
} 
相關問題