顺时针打印阵列

本文关键字:阵列 打印 顺时针 | 更新日期: 2023-09-27 18:32:44

我有这个代码是从文本框接收数组,然后顺时针打印,但是当我跟踪此代码时没有以正确的方式打印我没有错误,但是运行时它不会顺时针显示结果我不知道错误在哪里

int i, k = 0, l = 0;
int m=4; 
int n=4;
/*  k - starting row index
    m - ending row index
    l - starting column index
    n - ending column index
    i - iterator
*/

string [,]a = new string[4,4];
string s = null;
for(int q=0;q<=4;q++){
    for(int j=0;j<=4;j++){
        a[q,j] = textBox1.Text[q].ToString();
    }
}
while (k < m && l < n)
{
    /* Print the first row from the remaining rows */
    for (i = l; i < n; i++)
    {
        s += a[k, i].ToString();
    }
    k++;
    /* Print the last column from the remaining columns */
    for (i = k; i < m; i++)
    {
        s += a[i, n - 1].ToString();
    }
    n--;
    /* Print the last row from the remaining rows */
    if (k < m)
    {
        for (i = n - 1; i >= l; i--)
        {
            s += a[m - 1, i].ToString();
        }
        m--;
    }
    /* Print the first column from the remaining columns */
    if (l < n)
    {
        for (i = m - 1; i >= k; i--)
        {
            s += a[i, l].ToString();
        }
        l++;
    }
    richTextBox1.Text = s.ToString();
}

顺时针打印阵列

如果您的目标文本是 SEND OONH SPLE GIVEN SEND HELP SOON,这看起来像矩阵中的螺旋,有 4 列和 3 行:

    0   1   2   3
0   S   E   N   D
1   O   O   N   H
2   S   P   L   E

您的代码似乎不适用于可能的输入(尽管您在 4x4 时的大小不正确,它是 4x3,让我们假设可能的输入是 SEND/nHELP/nSOON)。

例如
    0   1   2   3
0   S   E   N   D
1   H   E   L   P
2   S   O   O   N

我们还假设你用这个成功填充了"a",然后你的算法将第一行(向前)、最后一列(向下)、最后一行(向后),然后是第一列(向上)附加到输出字符串中 - 但正如你上面看到的,这将给出 SENDPNOOSHEL,而不是 SENDOONHSPLE。

下面是一些代码,用于以更通用的方式实现请求的结果。该算法的想法是填充数组,先向右然后向下,向左和向上,每次命中边界时改变方向,然后减小可访问的大小,以免覆盖已经写入的数据。

static void Main(string[] args)
{   
    string text = "SENDHELPSOON";
    Queue<char> chars = new Queue<char>();
    foreach (char letter in text)
            chars.Enqueue(letter);
    char[,] resultMatrix = new char[3, 4];
    int maxX = resultMatrix.GetLength(1);
    int maxY = resultMatrix.GetLength(0);
    int minX = 0; int minY = 0; int x = 0; int y = 0;
    int direction = 1;       
    if ((maxY * maxX) < chars.Count)
        throw new InvalidOperationException("Not enough space in the output matrix");
    while (chars.Count > 0)
    {            
        // going across (either left or right)
        while (x >= minX && x < maxX && chars.Count > 0)
        {
            resultMatrix[y, x] = chars.Dequeue();                                
            x += direction;
        }
        x -= direction; // undo the last one
        y += direction; // offset spiral
        if (direction > 0) minY++; // reduce boundaries
        if (direction < 1) maxY--;            
        // going vertically (up or down)
        while (y >= minY && y < maxY && chars.Count > 0)
        {
            resultMatrix[y, x] = chars.Dequeue();
            y += direction;
        }
        y -= direction; // undo the last one
        if (direction > 0) maxX--; // reduce boundaries
        if (direction < 1) minX++;
        direction *= -1;
        x += direction; // offset spiral
    }
    StringBuilder inOrder = new StringBuilder();
    for (int i = 0; i < resultMatrix.GetLength(0); i++)
    {
        for (int j = 0; j < resultMatrix.GetLength(1); j++)
        {
            inOrder.Append(resultMatrix[i, j]);
        }
    }
    // SENDOONHSPLE
    Console.WriteLine(inOrder);
    Console.ReadKey();
}