我以为这是沿其主对角线打印。
.
在这个例子中,我们列出了以下的索引。arr2d
:
(0, 2)
(0, 1), (1, 2)
(0, 0), (1, 1), (2, 2)
(1, 0), (2, 1)
(2, 0)
看到规律了吗?
x
每行第一个元素的数量仍然是 0
和 y
减少。 y
每行第一个元素的数量仍然是 0
和 x
增加。(x++, y++)
,直至 x
或 y
≥3.对于更一般的方式,一 n
维矩阵具有 2n-1
线的trangle。
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
我喜欢Sheey的答案,尽管我很困扰,因为数组的尺寸是硬编码的。 所以这里有一个通用的方法,使用 GetUpperBound() 来确定rowscolumns的数量。
调用 GetUpperBound(0)
会告诉你有多少ROWS,而 GetUpperBound(1)
会给出COLUMNS的数量。
我们可以从数组的右上角开始向左移动,得到所有对角线起始位置的坐标。 一旦我们到了左边,我们就会沿着数组向下移动。 从每一个起始位置,我们通过递增两个起始的xy位置来获得对角线的值,同时它们还在数组的范围内。 这是一种罕见的情况,在这种情况下 for
循环,可以使用多个变量。
这段代码还根据最大的值来填充输出,这样三角形就可以处理任何大小的整数。
需要注意的是,当访问一个二维数组时,在访问二维数组时,在 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...