给定一个矩阵,打印给定的三角形

问题描述 投票:1回答:1

给定2维。

int[,] arr2d = new int[3,3]
                            {
                                {1, 2, 3}, 
                                {4, 5, 6}, 
                                {7, 8, 9} 
                            };

目标: 打印给定三角形图案的二维数组,使其显示如下。enter image description here

c# arrays matrix multidimensional-array
1个回答
2
投票

我以为这是沿其主对角线打印。

picture.

在这个例子中,我们列出了以下的索引。arr2d:

(0, 2)
(0, 1), (1, 2)
(0, 0), (1, 1), (2, 2)
(1, 0), (2, 1)
(2, 0)

看到规律了吗?

  • 在前三行中。x 每行第一个元素的数量仍然是 0y 减少。
  • 在最后3行中 y 每行第一个元素的数量仍然是 0x 增加。
  • 在每一行中,相对于前一行的下一个元素是 (x++, y++),直至 xy ≥3.

对于更一般的方式,一 n 维矩阵具有 2n-1 线的trangle。

  • 在第一个 n 行,该 x 剩余的第一要素 0జజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజ y 减少。
  • 在过去的一年里 n 行,该 y 剩余的第一要素 0జజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజ x 增加。
  • 每行打印 (x++, y++) 直到 xy ≥3.

这是代码。

static void Main(string[] args) {
    int[,] arr2d = new int[3,3]
                    {
                        {1, 2, 3}, 
                        {4, 5, 6}, 
                        {7, 8, 9} 
                    };

    int dimension = 3;
    int x = 0, y = dimension - 1

    while(y >= 0) {
        WriteDiagalNumbers(arr2d, x, y, dimension);
        y--;
        // or shorten as
        // WriteDiagalNumbers(arr2d, x, y--, dimension);
    }

    x = 1;
    y = 0;

    while(x < dimension) {
        WriteDiagalNumbers(arr2d, x, y, dimension);
        x++;
        // or shorten as
        // WriteDiagalNumbers(arr2d, x++, y, dimension);
    }

}

static void WriteDiagalNumbers(int[,] arr, int x, int y, int dimension) {
    List<int> nums = new List<int>();

    while(x < dimension && y < dimension) {
        nums.Add(arr[x, y]);
        x++;
        y++;
        // or shorten as
        // nums.Add(arr[x++, y++]);
    }

    Console.WriteLine(string.Join(", ", nums));
}

给出了输出结果

3
2, 6
1, 5, 9
4, 8
7

1
投票

我喜欢Sheey的答案,尽管我很困扰,因为数组的尺寸是硬编码的。 所以这里有一个通用的方法,使用 GetUpperBound() 来确定rowscolumns的数量。

调用 GetUpperBound(0) 会告诉你有多少ROWS,而 GetUpperBound(1) 会给出COLUMNS的数量。

我们可以从数组的右上角开始向左移动,得到所有对角线起始位置的坐标。 一旦我们到了左边,我们就会沿着数组向下移动。 从每一个起始位置,我们通过递增两个起始的xy位置来获得对角线的值,同时它们还在数组的范围内。 这是一种罕见的情况,在这种情况下 for 循环,可以使用多个变量。

这段代码还根据最大的值来填充输出,这样三角形就可以处理任何大小的整数。

需要注意的是,当访问一个二维数组时,在访问二维数组时,在 xy 的参数是相反的。

arr[y, x]

你列出了 y 值作为第一个参数,而 x 值作为第二个参数。

所以用这个数组。

int[,] arr2d = new int[,]
                {
                    {85, 86, 87, 88},
                    {89, 90, 91, 92},
                    {93, 94, 95, 96},
                    {97, 98, 99, 100}
                }

88的值,使用零点符号,通常会被认为是在坐标(2,0)上,但会用 arr2d[0, 2].

同样,97值通常被认为在坐标(0,2)处,但可以用 arr2d[2, 0].

我觉得这种做法很不一样,值得对这个问题作出补充回答。

static void Main(string[] args)
{
    int[,] arr2d = new int[,]
                    {
                        {85, 86, 87, 88},
                        {89, 90, 91, 92},
                        {93, 94, 95, 96},
                        {97, 98, 99, 100}
                    };

    printTriangle(arr2d);

    Console.Write("Press Enter to quit...");
    Console.ReadLine();
}

static void printTriangle(int[,] arr)
{
    // Get all the starting positions for "diagonals":
    // Start in the top right of the array,
    // then move all the way left,
    // followed by all the way down.
    int y = 0;
    int x = arr.GetUpperBound(1);
    bool travelLeft = true;
    bool triangleComplete = false;
    List<string> diagonalValues = new List<string>();
    int pad = arr.Cast<int>().Max().ToString().Length;

    while (!triangleComplete)
    {
        diagonalValues.Clear();    
        for(int yTemp = y, xTemp = x;
            xTemp <= arr.GetUpperBound(1) && yTemp <= arr.GetUpperBound(0);
            xTemp++, yTemp++)
        {
            diagonalValues.Add(arr[yTemp, xTemp].ToString().PadLeft(pad));
        }
        Console.WriteLine(String.Join(", ", diagonalValues));

        if (travelLeft)
        {
            x--; // move left
            travelLeft = (x > 0);
        }                
        else
        {
            y++; // move down
            triangleComplete = (y > arr.GetUpperBound(1));
        }
    }
}

产出:

 88
 87,  92
 86,  91,  96
 85,  90,  95, 100
 89,  94,  99
 93,  98
 97
Press Enter to quit...
© www.soinside.com 2019 - 2024. All rights reserved.