0

我需要一个具有以下签名的函数:

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

array[row][column]该函数应该增加与(除了array[row][column]它自己)相同的行、列和对角线中的所有值。

假设我有以下二维数组:

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]++;
    }
}

对于对角线,它有点复杂。您可以从选定的点开始,然后一个接一个地穿过对角线。例如,这段代码:

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 回答