顺时针打印阵列
本文关键字:阵列 打印 顺时针 | 更新日期: 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();
}