这应该是一个相当直截了当的问题,但我似乎无法弄清楚如何获得非方阵的所有对角线。
我已经拥有了我认为的反对角线(示例:https://stackoverflow.com/a/33769730),但我也需要相反的对角线。
示例数组:
1 2 3 4
5 6 7 8
9 10 11 12
当前输出:
[1], [2,5], [3,6,9], [4,7,10], [8,11], [12]
预期的额外产出:
[4], [3,8], [2,7,12], [1,6,11], [5,10], [9]
我正在寻找伪代码,所以我可以更好地理解它。
编辑:代码我必须得到反对角线(因为似乎没有人想要关注链接)
int ndiags = width + height - 1;
System.out.println("---");
for (int diag = 0; diag < ndiags; diag++) {
int row_stop = Math.max(0, diag - width + 1);
int row_start = Math.min(diag, height - 1);
for (int row = row_start; row >= row_stop; row--) {
// on a given diagonal row + col = constant "diag"
// diag labels the diagonal number
int col = diag - row;
System.out.println(col + "," + row);
relax(col, row);
}
System.out.println("---");
}
我尝试了以下内容,但我仍然只是反对角线:
int ndiags = width + height - 1;
System.out.println("---");
for (int diag = 0; diag < ndiags; diag++) {
int row_stop = Math.max(0, diag - height + 1);
int row_start = Math.min(diag, width - 1);
for (int row = row_start; row >= row_stop; row--) {
// on a given diagonal row + col = constant "diag"
// diag labels the diagonal number
int col = diag - row;
System.out.println(col + "," + row);
relax(col, row);
}
System.out.println("---");
}
答案 0 :(得分:1)
从左上角到右下方向的每个对角线由j - i
值定义,其中i
是行号,j
是列号。请注意,某些标识符可能是否定的。
所以伪代码可能是这样的:
int
键和Linst<int>
值创建字典。j - i
值标识的列表中。最后,您可以以任一方式从字典中提取列表,因为项目按整数键键排序。排序对应于首先采用右上角或左下角的方式。
此方法的一个优点是您不需要处理矩形矩阵尺寸并应用任何检查。只需一次矩阵遍历。
你能举例说明一下这个列表的样子吗?
字典可能如下所示:
keys: -2 -1 0 1 2 3
-------------------------------
lists: 9 5 1 2 3 4
10 6 7 8
11 12
列表元素从上到下可视化。
答案 1 :(得分:1)
您可以为任何矩阵推广此代码...现在它为上面指定的矩阵打印正确的输出
输出:[4 ] [3 8 ] [2 7 12 ] [5 10 ] [9 ]
class Diagonal
{
public static void main(String[] args)
{
int r=3,c=4;
int Mat[][]={{1,2,3,4},{5, 6 ,7 ,8},{9,10,11,12}};
int x,y;
for(int i=c-1;i>0;i--)
{
y=i;x=0;
System.out.print("[");
while(y<c)
{
System.out.print(Mat[x][y]+" ");
x++;y++;
}
System.out.print("] ");
}
for(int i=1;i<r;i++)
{
x=i;y=0;
System.out.print("[");
while(x<r)
{
System.out.print(Mat[x][y]+" ");
x++;y++;
}
System.out.print("] ");
}
}
}
对于反对角线:
输出:[1 ] [2 5 ] [3 6 9 ] [4 7 10 ] [8 11 ] [12 ]
class Diagonal
{
public static void main(String[] args)
{
int r=3,c=4;
int Mat[][]={{1,2,3,4},{5, 6 ,7 ,8},{9,10,11,12}};
int x,y;
for(int i=0;i<c;i++)
{
y=i;x=0;
System.out.print("[");
while(y>=0 && x<r)
{
System.out.print(Mat[x][y]+" ");
x++;y--;
}
System.out.print("] ");
}
for(int i=1;i<r;i++)
{
x=i;y=c-1;
System.out.print("[");
while(x<r)
{
System.out.print(Mat[x][y]+" ");
x++;y--;
}
System.out.print("] ");
}
}
}