0

次のシグネチャを持つ関数が必要です。

public void requiredFunction(int[][] array, int row, int column) {
    // code
}

関数は、(それ自体array[row][column]を除く)と同じ行、列、および対角線のすべての値をインクリメントする必要があります。array[row][column]

次の2D配列があるとします。

int[][] array = {
    0 0 0 0 0 0
    0 0 0 0 0 0
    0 0 0 0 0 0
    0 0 0 0 0 0
    0 0 0 0 0 0
    0 0 0 0 0 0
};

次の値を使用してこの関数を呼び出すと、次のようになります。

requiredFunction(array, 2, 2);

配列を次のように変換する必要があります。

array = {
    1 0 1 0 1 0
    0 1 1 1 0 0
    1 1 0 1 1 1
    0 1 1 1 0 0
    1 0 1 0 1 0
    0 0 1 0 0 1
};

配列をチェス盤と考えると、関数は女王の位置(行と列)を取り、女王が移動できるチェス盤上の場所をインクリメントします。

4

2 に答える 2

2

ここにもっと短いものがあります:

public void requiredFunction(int[][] array, int row, int column) {
  for (int i = 0; i < array.length; ++i) {
      for (int j = 0; j < array[i].length; ++j) {
           if (i == column && j == row)
               continue;
           if (Math.abs(i - column) == Math.abs(j - row) ||
               i - column == 0 || j - row == 0)
               array[i][j]++;                                    
      }
  }
}
于 2012-09-30T07:46:21.023 に答える
0

まず、行と列は簡単です。次のように言います。

public void requiredFunction(int[][] array, int row, int column) {
    //row
    for(int i=0;i<arr.length;i++){
       if(i==col)continue;
       arr[row][i]++;
    }
    //col
    for(int i=0;i<arr[0].length;i++){
       if(i==col)continue;
       arr[i][col]++;
    }
}

対角線の場合は、もう少し複雑です。選択したポイントから開始し、対角線を 1 つずつ移動できます。たとえば、次のコード:

for(int i=row+1,j=col+1;;++i,++j){
   try{
       arr[i][j]++;
   }catch(IndexOutOfBoundsException e){//the i or j went too far from the board
       break;
   }
}

右と下の対角線にある値を増やします。--i代わりに++iまたは--jの代わりにを使用した同様のループ++jは、他の対角線についても同じことを行います。

編集:以下 のコメントのように、IndexOutOfBoundsException の代わりに通常の終了条件を使用する方がよいため、ループは次のようになります。

for(int i = row+1, j = col+1; i <= arr.length && j <= arr[0].length; ++i, ++j){
   arr[i][j]++;
}
于 2012-09-30T07:28:34.057 に答える