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