【问题标题】:Diagonal Lines in NonSquare Array非方阵中的对角线
【发布时间】:2016-07-02 10:56:44
【问题描述】:

这应该是一个相当直截了当的问题,但我似乎无法弄清楚如何获得非方阵的所有对角线。

我已经有了我认为的对角线(例如: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("---");
}

【问题讨论】:

  • 发布您已有的内容。另外,这是 Java 还是 C#?
  • 无所谓 - 我可以在两者之间进行翻译
  • 不过,您在问题中说您已经拥有了一些东西。你能把它贴出来并说它有什么问题吗?

标签: java c#


【解决方案1】:

从左上角到右下角的每个对角线都由j - i 值定义,其中i 是行号,j 是列号。请注意,某些标识符可以为负数。

所以伪代码可能是这样的:

  • 使用int 键和Linst&lt;int&gt; 值创建字典。
  • 遍历数组的每个元素。
  • 将当前元素附加到由字典中的j - i 值标识的列表中。

最后,您可以通过任何一种方式从字典中提取列表,因为项目按整数键键排序。排序对应于先取右上角或左下角对角线的方式。

此方法的一个优点是您无需处理矩形矩阵尺寸并应用任何检查。只需一次矩阵遍历。

您能否举例说明该列表的外观?

字典可能如下所示:

keys:   -2   -1   0   1   2   3
-------------------------------
lists:   9    5   1   2   3   4
             10   6   7   8
                 11  12

列表元素从上到下可视化。

【讨论】:

  • 我无法将其可视化(可能是因为我研究 2D 已经很久了):您能举个例子说明一下这个列表可能是什么样子吗?
  • 我真的很喜欢这个解决方案 - 这超出了我最初的问题,但您认为它也适用于 3D 阵列吗?
  • 是的,它可以应用于 3D。然而,“对角线”将由 3D 矩阵的表面表示。将有 3 个方向。
【解决方案2】:

您可以将此代码推广到任何矩阵...现在它为上述指定矩阵打印正确的输出

输出:[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("] ");
        }

    }
}

【讨论】:

  • 这正是我想问的!
  • 如果您将for(int i=1;i&lt;r;i++) 更改为for(int i=0;i&lt;r;i++),那么当数组为正方形时,它还包括主对角线
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多