【问题标题】:Function to set row, column, and diagonal elements in a 2D array given a cell in the array给定数组中的单元格,用于设置二维数组中的行、列和对角线元素的函数
【发布时间】:2012-09-30 07:10:40
【问题描述】:

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

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

如果您将数组视为棋盘,则该函数将获取皇后的位置(行和列)并递增棋盘上皇后可以移动到的位置。

【问题讨论】:

  • 请编辑您的问题以包含一个sscce,以显示您当前的方法。
  • 那么,这里的问题是什么?和what have yout tried?

标签: java matrix set 2d row


【解决方案1】:

这里有一些更短的内容:

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

【讨论】:

  • 投票需要 15 声望。 :|但是非常感谢。这正是我一直在寻找的。你能解释一下第二个 if 条件背后的逻辑吗?
  • 如果绝对距离相等,则计算当前索引与目标索引(行和列)之间的“距离”,那么您在对角线上
【解决方案2】:

首先行列很简单,比如说:

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

【讨论】:

  • 既然知道数组的长度,为什么还要使用IndexOutOfBoundsException作为终止条件?您的第一个示例中也缺少括号。
  • @assylias 只是因为它更短,犯愚蠢错误的可能性更低,而且可读性更高(至少对我而言)。
  • 这是一种“hacky”解决方案。我其实是在准备面试,所以如果有人问我需要这个功能的东西,我认为给出这个解决方案不是一个好主意。
猜你喜欢
  • 1970-01-01
  • 2017-11-07
  • 2015-06-16
  • 2011-09-16
  • 1970-01-01
  • 2023-04-02
  • 2020-03-09
  • 2019-08-02
  • 1970-01-01
相关资源
最近更新 更多