2D 配列 arr[n][n] を取得しました。任意のインデックスを選択し、タスクは周囲の要素の最小値と最大値をカウントすることです (隅にある場合は少なくとも 3、中央にある場合は 8)。皆さんに解決を求めるのではなく、実行する方がよい方法についてアドバイスをください。
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
反復回数が減り、1 つずれてしまうエラーが修正され、よりシンプルになり、最大値と最小値の検出に関する質問に答えたバージョン。
// (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 に答える