2017-04-18 30 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; 
} 
相关问题