假设我有一个像这样的4乘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中的每个数字带
matrice 2中的每个数字都带有b
matrice 3中的每个数字
matrice 4中的每个数字都带有d
矩阵的最后形式:
a a c c
a a c c
b b d d
b b d d
这应该在n * m的情况下推广。
我不知道从哪里开始。我会说出任何想法。
答案 0 :(得分: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)
}
}
这是一个pseduo代码解决方案。您可以针对边界情况进行调整,不进行调整。我只是让整数除法决定你的边界情况,这是最有意义的,也是最简单的,但你可以通过微小的方式修改逻辑,使其表现得像你想要的那样。如果i = n / 2,j = m / 2,i <1,则还可以使用组合将逻辑包括在多个for循环中。 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个值,那么如何修改它可以定义太多方法让我能够深入了解如何解决它。
答案 1 :(得分: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;
}
}
但是,一旦alfabet耗尽,这将开始放置非alfabet字符。
它应该做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 ]