【问题标题】:Finding position in a matrix在矩阵中查找位置
【发布时间】:2015-11-07 00:20:36
【问题描述】:

我有一个 3x3 的矩阵,看起来像

1 2 3

4 5 6

7 8 9

每个数字后面都是一个对象。 所以我写了这段代码,它将返回我目前在矩阵中的哪个位置。但是感觉非常重复,我很好奇是否可以优化那段代码。如果有,怎么做?

public int findPos(int i, int k) {
    if (i == 0 && k == 0) {
        return 1;
    }
    if (i == 0 && k == 1) {
        return 2;
    }
    if (i == 0 && k == 2) {
        return 3;
    }
    if (i == 1 && k == 0) {
        return 4;
    }
    if (i == 1 && k == 1) {
        return 5;
    }
    if (i == 1 && k == 2) {
        return 6;
    }
    if (i == 2 && k == 0) {
        return 7;
    }
    if (i == 2 && k == 1) {
        return 8;
    }
    if (i == 2 && k == 2) {
        return 9;
    }

    return 0;
}

该方法后来以这种方式应用

if (myMatrix[i][k] == 2) {
    position = findPos(i, k);
    drawAtPos(position);
}

【问题讨论】:

    标签: optimization matrix


    【解决方案1】:

    你能不能把它转换成:

    public int findPos(int i, int k) {
        if (0 <= i && i < COLUMN_COUNT && 0 <= k && k < row_COUNT){ // out of bounds
          return 0;
        }
        return (i * 3) + (k + 1);
    }
    

    所有这一切都是为了将​​您的条件简化为数学,因为每列向右每个位置返回 1 的偏移量,并且每行需要增加 3。

    对于更通用的解决方案,它将是:

    public int findPos(int i, int k) {
        if (0 <= i && i < COLUMN_COUNT && 0 <= k && k < row_COUNT){ // out of bounds
          return 0;
        }
        return (i * COLUMN_COUNT) + (k + 1);
    }
    

    其中 COLUMN_COUNT 是您拥有的列数。所以它适用于:

    1 2 3  4  5  6
    7 8 9 10 11 12
    

    其中 COLUMN_COUNT = 6

    【讨论】:

      【解决方案2】:

      您可以通过以下方式计算您的位置:

      if (0 <= i && i < 3 &&
            0 <= k && k < 3) {    
         // number of rows passed * size of each row + current column + 1 for 0-to-1-based-conversion
         return (i * 3) + (k + 1);
      } else {
         return 0;
      }
      

      【讨论】:

        【解决方案3】:

        这是怎么回事?

        (i*3 + k) + 1
        

        为什么有效?好吧,从你的矩阵中减去 1,所以它看起来像这样:

        0 1 2
        3 4 5
        6 7 8
        

        所以应该很明显。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多