0

我们得到了二维数组 arr[n][n]。我们选择任何索引,任务是计算周围元素的最小值和最大值(如果它在角落,则至少为 3,如果在中间某处,则为 8)。不要要求你们为我解决它,而是就如何更好地执行提出建议。

4

2 回答 2

1

给定数组 (x, y) 中的一个位置,您需要访问每个周围的条目。

for ( int i = -1; i <= 1; i++ ) {
  for ( int j = -1; j <= 1; j++ ) {
    // Don't visit off-array locations.
    if ( inArray(x+i,y+j) ) {
      // Don't visit the center cell (you wanted the 8 surrounding cells).
      if ( i != 0 && j != 0 ) {
        check (x+i,y+j);
      }
    }
  }
}
于 2013-10-17T16:10:47.150 回答
0

一个减少了迭代量的版本,修正了一个错误,更简单并回答了关于最大/最小查找的问题。

// (x,y) is the center point;
// assert ( x>=0 && y>=0 && x<n && y<n );
int min = Integer.MAX_VALUE, max = Integer.MIN_VALUE, m = n-1;

for( int i = (x==0)? 0 : x-1, x_max = (x==m)? m : x+1; i <= x_max; i++ )
  for( int j = (y==0)? 0 : y-1, y_max = (y==m)? m : y+1; j <= y_max; j++ ) {
    if( arr[i][j] < min )
      min = arr[i][j];
    else if ( arr[i][j] > max )
      max = arr[i][j];
    }

// now you have the max/min values set

或者,如果您更喜欢没有三元运算符的更详细的版本(速度较慢,但​​对初学者来说更易读):

// (x,y) is the center point
int x_min = x - 1, y_min = y - 1,
    x_max = x + 1, y_max = y + 1,
    min = Integer.MAX_VALUE, max = Integer.MIN_VALUE;
if ( x_min < 0 )
  x_min = 0;
if ( y_min < 0 )
  y_min = 0;
if ( x_max > n - 1 ) // you can set 'int m = n - 1;'
  x_max = n - 1;     // and use m here instead if you wish
if ( y_max > n - 1 )
  y_max = n - 1;

for( int i = x_min; i <= x_max; i++ )
  for( int j = y_min; j <= y_max; j++ ) {
    if( arr[i][j] < min )
      min = arr[i][j];
    else if ( arr[i][j] > max )
      max = arr[i][j];
    }

// now you have the max/min values set
于 2013-10-17T16:33:19.357 回答