C# 如何迭代网格算法

C# 如何迭代网格算法,c#,C#,我正在寻找一种算法,它可以遍历一个网格,并将其转换为另一个网格,索引以新的顺序排列 基本上,给定一个大小为n*m的网格: 1_1 1_2 1_3 ... 1_n 2_1 2_2 2_3 ... 2_n . . . m_1 m_2 m_3 ... m_m 如何将其转换为: 1_1 1_2 1_4 ... 1_3 1_5 ... 1_6 ... ... . . . 假设,您迭代第一个网格,从左到右在顶行,然后 第二排从左到右,一直到下一排从左到右 基本上,我把元素推到一个上面的三角形中 另一个问

我正在寻找一种算法,它可以遍历一个网格,并将其转换为另一个网格,索引以新的顺序排列

基本上,给定一个大小为n*m的网格:

1_1 1_2 1_3 ... 1_n
2_1 2_2 2_3 ... 2_n
.
.
.
m_1 m_2 m_3 ... m_m
如何将其转换为:

1_1 1_2 1_4 ...
1_3 1_5 ...
1_6 ...
...
.
.
.
假设,您迭代第一个网格,从左到右在顶行,然后 第二排从左到右,一直到下一排从左到右

基本上,我把元素推到一个上面的三角形中

另一个问题是,我如何通过知道n和m是什么来计算用于存储三角形的网格的长度和宽度? 这有公式吗

例如,5*6的网格将更改为8*7

1  2  3  4  5
6  7  8  9  10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
26 27 28 29 30
变成:

 1  2  4  7  11 16 22 29
 3  5  8  12 17 23 30
 6  9  13 18 24
 10 14 19 25
 15 20 26
 21 27
 28

让我们定义起始网格NxM中每个网格元素i,j的顺序位置Oi,j,即函数i,j->i*N+j

现在,对于小于Oi,j的最大三角形数,对于一些k,称之为T==kk+1/2,i,j的新网格位置为: i、 j->Oi,j-T,k+T-Oi,j

现在替换Oi、j和T以获得:

i、 j->i*N+j-kk+1/2,k+k+1k+2/2-i*N+j

=i*N+j-kk+1/2,k+1k+2/2-i*N+j

这是我目前所能做到的

更新:
再次注意,k是三角形数T==kk+1/2的边长。

让我们定义起始网格NxM中每个网格元素i,j的顺序位置Oi,j,即函数i,j->i*N+j

现在,对于小于Oi,j的最大三角形数,对于一些k,称之为T==kk+1/2,i,j的新网格位置为: i、 j->Oi,j-T,k+T-Oi,j

现在替换Oi、j和T以获得:

i、 j->i*N+j-kk+1/2,k+k+1k+2/2-i*N+j

=i*N+j-kk+1/2,k+1k+2/2-i*N+j

这是我目前所能做到的

更新:
再次注意,k是三角形数T==kk+1/2的边长。

以下内容似乎适用于我:

public static T[,] ConvertToUpperTriangle<T>(T[,] arr)
{
    // calculate the dimensions
    int elements = arr.GetLength(0) * arr.GetLength(1);

    double rows = 0.5 * (Math.Sqrt(8 * elements + 1) - 1);

    int newHeight = (int)rows;
    int newWidth = (int)Math.Ceiling(rows);

    // create the new array
    var arr2 = new T[newHeight, newWidth];

    int j = 0;
    int i = 0;
    foreach (T element in arr)
    {
        arr2[j, i] = element;
        i--;
        j++;
        if (i < 0)
        {
            i = j;
            j = 0;
        }
    }

    return arr2;
}

以下几点似乎对我有用:

public static T[,] ConvertToUpperTriangle<T>(T[,] arr)
{
    // calculate the dimensions
    int elements = arr.GetLength(0) * arr.GetLength(1);

    double rows = 0.5 * (Math.Sqrt(8 * elements + 1) - 1);

    int newHeight = (int)rows;
    int newWidth = (int)Math.Ceiling(rows);

    // create the new array
    var arr2 = new T[newHeight, newWidth];

    int j = 0;
    int i = 0;
    foreach (T element in arr)
    {
        arr2[j, i] = element;
        i--;
        j++;
        if (i < 0)
        {
            i = j;
            j = 0;
        }
    }

    return arr2;
}

啊!有人知道如何修复我的mesed up格式吗?我所做的只是缩进,我失去了对格式的控制。加下划线的文本将其转换为标题。如果有人知道k的封闭形式,则可以完成证明@马修·斯特劳布里奇:我会说谢谢你,但那只会被一些主持人或其他人剥夺。也许你会在这之前看到ti。我不明白这个公式,k是什么?k是三角形的边长,对于三角形数t:称它为t==kk-1/2,对于一些k.Aargh!有人知道如何修复我的mesed up格式吗?我所做的只是缩进,我失去了对格式的控制。加下划线的文本将其转换为标题。如果有人知道k的封闭形式,则可以完成证明@马修·斯特劳布里奇:我会说谢谢你,但那只会被一些主持人或其他人剥夺。也许你会在这之前看到ti。我不明白这个公式,k是什么?k是三角形的边长,对于三角形数t,称它为t==kk-1/2,对于一些k。如果我想在三角形中找到30的x和y坐标,我怎么得到它?如果我想在三角形中找到30的x和y坐标,我如何得到它?如果我想找到三角形中第30个元素的x和y坐标,我如何得到它?答案是6,1,但我不知道怎么得到它。@omega:第七个三角形的数字是28=7*7+1/2。30 - 28 = 2. 第八条对角线将是点7,0,6,1,…如果我想找到三角形中第30个元素的x和y坐标,我将如何得到它?答案是6,1,但我不知道怎么得到它。@omega:第七个三角形的数字是28=7*7+1/2。30 - 28 = 2. 第八条对角线是点7,0,6,1。。。