Мне нравится ответ Ши, хотя меня беспокоит то, что размеры массива жестко запрограммированы в этом решении. Итак, вот общий подход 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...