该程序应该从 0 计数到 19 并分配连续的数字,对角线穿过矩阵,如图所示:
我这样做了,它给了我与图像相同的结果,但我认为使用的方法不正确。
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner leer=new Scanner(System.in);
int a[][]=new int [4][5];
for(int i=0;i<a.length;i++){
for(int j=0;j<a.length+1;j++){
a[1][0]=a[0][0]+1;
a[0][1]=a[1][0]+1;
a[2][0]=a[0][1]+1;
a[1][1]=a[2][0]+1;
a[0][2]=a[1][1]+1;
a[3][0]=a[0][2]+1;
a[2][1]=a[3][0]+1;
a[1][2]=a[2][1]+1;
a[0][3]=a[1][2]+1;
a[3][1]=a[0][3]+1;
a[2][2]=a[3][1]+1;
a[1][3]=a[2][2]+1;
a[0][4]=a[1][3]+1;
a[3][2]=a[0][4]+1;
a[2][3]=a[3][2]+1;
a[1][4]=a[2][3]+1;
a[3][3]=a[1][4]+1;
a[2][4]=a[3][3]+1;
a[3][4]=a[2][4]+1;
}
}
for(int i=0;i<a.length;i++){
System.out.println();
for(int j=0;j<a.length+1;j++){
System.out.print(a[i][j]+"\t");
}
}
}
M x N
沿对角线遍历矩阵在数组
M x N
中,让我们考虑数组中每个位置的索引。有一个非常有趣的性质:如果我们将索引 x + y 相加,我们会得到每个对角线的数量。
这样,每个对角线都必须被填充。
并且对角线的数量总是
M + N - 1
。例如,对于
4 x 5
,4 + 5 - 1 = 8
,有 8 条对角线(从 0 到 7)。所以,我们可以迭代:
0
,而它小于n + m - 1
。y = diagonal
到0
的行x = diagonal - y
。y
不超过它的维度m
⇒
y
从Math.min(diagonal,m - 1)
到0
x
不超过它的尺寸n
⇒
x < n
num
每次赋值后递增⇒
a[y][x] = num++;
。代码:
结果:
示范:
Ideone.com
困难在于表达最佳方法是非常主观的。
现在,如果标准是在对角序列中填充矩阵的算法应该适用于任何维度的矩阵,那么现在是的,我可以理解需要更好的方法。
如果是这样的话,我会实现这样的算法(注意
dimX
和dimY
可以调整以改变数组的维度):结果:
不过,我确信有更好的方法。