По заданной матрице выведите заданный треугольник - PullRequest
1 голос
/ 16 июня 2020

Дано 2-мерное:

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

Цель: Распечатать 2-й массив в заданном шаблоне треугольника, чтобы он выглядел следующим образом: enter image description here

Ответы [ 2 ]

2 голосов
/ 16 июня 2020

Я думал, это отпечаток по его главной диагонали.

picture.

В данном примере мы перечисляем индексы arr2d:

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

Видите обычный шаблон?

  • В первых 3 строках x первого элемента в каждой строке остается 0, а y уменьшается.
  • В последних 3 строках y первого элемента в каждой строке остается 0, а x увеличивается.
  • В каждой строке следующим элементом относительно предыдущего является (x++, y++), до тех пор, пока не будет x или y ≥3.

В более общем случае размерная матрица n имеет 2n-1 линию перехода.

  • В первых строках n x первого элемента остается до 0, y уменьшается.
  • В последних n строках y первого элемента остается до 0, x увеличивается.
  • Для каждой строки выведите (x++, y++) до тех пор, пока не будет x или y ≥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 голос
/ 16 июня 2020

Мне нравится ответ Ши, хотя меня беспокоит то, что размеры массива жестко запрограммированы в этом решении. Итак, вот общий подход c, использующий GetUpperBound () для определения количества строк / столбцов.

Вызов GetUpperBound(0) скажет вам, сколько ROWS, а GetUpperBound(1) даст количество КОЛОНН.

Мы можем получить координаты всех диагональных начальных позиций, начав с правого верхнего угла массива и двигаясь влево. Как только мы попадаем в левую часть, мы перемещаемся вниз по массиву. Из каждой из этих начальных позиций мы получаем значения диагонали, увеличивая обе начальные позиции x / y, пока они находятся в пределах массива. Это один из тех редких случаев, когда можно использовать for l oop с несколькими переменными.

Код также дополняет вывод на основе наибольшего значения, чтобы треугольник мог обрабатывать целые числа любого размера.

Обратите внимание, что при доступе к 2D-массиву параметры x и y меняются местами:

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...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...