顺时针打印阵列

时间:2014-11-30 19:14:28

标签: c# arrays

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

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();
}

1 个答案:

答案 0 :(得分:2)

如果您的目标文字是SEND OONH SPLE给出SEND HELP SOON,这看起来像一个带有4个col和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)。 e.g。

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

让我们假设你填充&#34; a&#34;成功完成此操作后,您的算法会将输出字符串追加到第一行(向前),最后一列(向下),最后一行(向后),然后是第一列(向上) - 但如上所示,这将给出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();

}