这实际上是一个很好的数学问题。认为:
int side = to - from + 1; /// the size/width of the square.
正方形(行,列)中任意点的值是:
from + ((row + col) % side)
你应该能够把它放在你的循环中并“抽它”。
根据要求解释的评论进行编辑。
诀窍是遍历“矩阵”中的所有位置。鉴于矩阵是方形的,循环相对简单,只有两个循环(嵌套)遍历系统:
final int side = to - from + 1;
for (int row = 0; row < side; row++) {
for(int col = 0; col < side; col++) {
... magic goes here....
}
}
现在,在这个循环中,我们有变量row
,col
它们代表我们感兴趣的矩阵中的单元格。该单元格中的值需要与它与原点的距离成正比.....让我解释一下.. ..如果原点是左上角(它是),那么到原点的距离是:
0 1 2 3 4
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
距离是行列之和……(行列从0开始计数)。
我们在每个矩阵中输入的值被限制在一个固定的范围内。对于上面的示例,对于大小为 5 的正方形,可以将其指定为printSquare(1,5)
。
每个单元格中的值是从值(在本例中为 1)加上与原点的距离......天真地,这看起来像:
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
5 6 7 8 9
这里单元格中的值已经超过了 5 的限制,我们需要将它们包裹起来......所以,诀窍是“包裹”到原点的距离......并且“模”运算符很棒为了那个原因。首先,考虑原始的“原点距离”矩阵:
0 1 2 3 4
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
如果我们用“除以 5 时的距离的余数”(模 5 或 %5)填充这个矩阵,我们得到矩阵:
0 1 2 3 4
1 2 3 4 0
2 3 4 0 1
3 4 0 1 2
4 0 1 2 3
现在,如果我们将这个“模”结果添加到 from 值 (1),我们将得到最终矩阵:
1 2 3 4 5
2 3 4 5 1
3 4 5 1 2
4 5 1 2 3
5 1 2 3 4
从某种意义上说,您只需要知道每个单元格的值是:
the from value plus the remainder when you divide the 'distance' by the width.
这是我测试的代码:
public static final String buildSquare(final int from, final int to) {
final StringBuilder sb = new StringBuilder(side * side);
final int side = to - from + 1;
for (int row = 0; row < side; row++) {
for(int col = 0; col < side; col++) {
sb.append( from + ((row + col) % side) );
}
sb.append("\n");
}
return sb.toString();
}
public static void main(String[] args) {
System.out.println(buildSquare(1, 5));
System.out.println(buildSquare(3, 9));
System.out.println(buildSquare(5, 5));
System.out.println(buildSquare(0, 9));
System.out.println(buildSquare(0, 3));
}