我在二维数组上有这个完全正常的循环。
for(int i = 0; i<array.length; i++){
for(int j = 0; i<array.length; j++){
array[i][j].doSomething();
}
}
我想通过这个二维数组,从中间开始。例如,如果两个维度的数组长度都为100,我希望它像这样重复:
array[50][50] //middle of array
array[49][50] //x-1
array[50][49] //y-1
array[51][50] //x+1
array[50][51] //y+1
array[48][50] //x-2
array[49][49] //x-1 and y-1
array[50][48] //y-2
array[51][49] //x+1 and y-1
array[52][50] //x+2
array[51][51] //x+1 and y+1
array[50][52] //y+2
array[49][51] //x-1 and y+1
etc.
我花了好几个小时寻找有效的方法并在互联网上找到解决方案,但我还没有找到一个好的答案。谁知道怎么做?
答案 0 :(得分:5)
这还没有给你任何java代码,而是一个如何解决问题的想法。
在一张纸上绘制一个尺寸小得多的数组网格,并绘制每个单元格中应该到达单元格的数字。
[ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ]
[ ][ ][1][ ][ ]
[ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ]
[ ][ ][3][ ][ ]
[ ][2][1][4][ ]
[ ][ ][5][ ][ ]
[ ][ ][ ][ ][ ]
[ ][ ][8][ ][ ]
[ ][7][3][9][ ]
[6][2][1][4][A]
[ ][D][5][B][ ]
[ ][ ][C][ ][ ]
[ ][F][8][G][ ]
[E][7][3][9][H]
[6][2][1][4][A]
[L][D][5][B][I]
[ ][K][C][J][ ]
[M][F][8][G][N]
[E][7][3][9][H]
[6][2][1][4][A]
[L][D][5][B][I]
[P][K][C][J][O]
清楚可见的是&#34;蜗牛&#34;图案。您始终填充先前填充的单元格的外部邻居单元格。
忽略第一次迭代填充的字段的外边界
1个细胞 - 然后是 4个细胞
8个细胞
12个细胞
...... +4个细胞
就循环而言,你不应该使用(i,j)
循环,它们都反映了数组中的索引。而是循环遍历round
,然后在该特定回合中打印相应的单元格。在第X
轮中,您从字段arrayLength / 2 - X
开始。
答案 1 :(得分:1)
基本的looop如下 -
K=1;
while(true) {
k=K-1;
for(n=0; n<=k; n++)
x=-k+n; y=-n;
for(n=1; n<=k; n++)
x=n; y=-k+n;
for(n=1; n<=k; n++)
x=k-n; y=n;
for(n=1; n<=k-1; n++)
x=-n; y=k-n;
if x out of bounds or y out of bounds continue;
K++;
if(K>N/2) break;
}
其中N是数组的大小(宽度或高度),K是中心K = 1的循环。
要找到x y坐标,你要进入四个循环左上方右上方.... - 由于坐标系位于N / 2,N / 2,你必须将它添加到x y。每个循环中有K + 2(K-1)+(K-2)元素