2

假设我有一个像这样的 4 x 4 矩阵:

1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4

用户输入一个随机部分编号,为简单起见,将其设为 2。我想在大矩阵内创建 2x2 矩阵。

Submatrice1:
1 1
2 2

Submatrice2:
3 3
4 4

Submatrice3:
1 1
2 2

Submatrice3:
3 3
4 4

然后我想更换

子矩阵 1 中的每个数字都有

矩阵 2 中的每个数字与 b

矩阵 3 中的每个数字

矩阵 4 中的每个数字与 d

矩阵的最后一种形式:

a a c c
a a c c
b b d d
b b d d

这应该推广到 n*m 的情况。

我不知道从哪里开始。我希望有任何想法。

4

2 回答 2

1

我会这样做:

someArray[4] = your input.
someBigArray[n][m];

for(int i = 0; i < n; i++) {
    for(int j = 0; j < m; j++) {

        if(i < n/2) 
            if(j < m/2)
                someBigArray[n][m] = (char)(someArray[0] + offsetASCIIToA)
            else 
                someBigArray[n][m] = (char)(someArray[1] + offsetASCIIToA)
        else 
            if(j < m/2)
                someBigArray[n][m] = (char)(someArray[2] + offsetASCIIToA)
            else 
                someBigArray[n][m] = (char)(someArray[3] + offsetASCIIToA)
     }
}

这是一个伪代码解决方案。您可以针对边界情况和其他情况进行调整。我只是让整数除法来决定你的边界情况,这是最有意义的,也是最简单的,但你可以用一些小的方式修改逻辑,使其表现得像你想要的那样。您还可以在多个 for 循环中包含逻辑,如果 i = n/2、j = m/2、i < m/2 以此类推,以此类推,则使用组合。这稍微更高性能(更少的分支),但更多的代码。每个解决方案都是 O(m * n)。下面的解决方案概述了这种可能的逻辑。

for(int i = 0; i < n/2; i++)
    for(int j = 0; j < m/2; j++)
        someBigArray[n][m] = (char)(someArray[0] + offsetASCIIToA)

for(int i = n/2; i < n; i++)
    for(int j = 0; j < m/2; j++)
        someBigArray[n][m] = (char)(someArray[1] + offsetASCIIToA)

for(int i = 0; i < n/2; i++)
    for(int j = m/2; j < m; j++)
        someBigArray[n][m] = (char)(someArray[2] + offsetASCIIToA)

for(int i = n/2; i < n; i++)
    for(int j = m/2; j < m; j++)
        someBigArray[n][m] = (char)(someArray[3] + offsetASCIIToA)

您现在所要做的就是弄清楚将 someArray 中的值转换为相应的字符值。只需查找 ASCII 表以获取此信息,并使用强制转换。

注意:这是对您的问题的一些假设。我觉得你的例子可能特别差。如果您的数组可能是 5 个值,您如何修改它可能被定义的方式太多,我无法深入了解我将如何解决它。

于 2013-05-28T17:59:25.440 回答
1

我会使用基于索引的计算,因为看起来初始内容并不重要。

/* Input: matrix and the size (2 in the example) */


/* The number of blocks. */
int block_height = (matrix.length + size/2) / size;

for(int row = 0; row < matrix.length; row++) {
  for(int col = 0; col < matrix[0].length; col++) {
    int block_row = row / size;
    int block_col = col / size;

    /* If we count up -> down, right -> left */
    char block_index = block_col * block_height + block_row;

    matrix[row][col] = 'a' + block_index;
  }
}

不过,一旦字母用完,这将开始放置非字母字符。

它应该为 2 执行以下操作,我真的不知道这种情况是否如您所想。

[ 1 1 1 1 1 ]       [ a a d d g ]
[ 2 2 2 2 2 ]       [ a a d d g ]
[ 3 3 3 3 3 ]  -->  [ b b e e h ]
[ 4 4 4 4 4 ]       [ b b e e h ]
[ 5 5 5 5 5 ]       [ c c f f i ]
于 2013-05-28T18:04:06.820 回答