以相反的顺序显示二维数组的行

Posted

技术标签:

【中文标题】以相反的顺序显示二维数组的行【英文标题】:Display rows of a 2d array in reverse order 【发布时间】:2020-12-06 23:50:06 【问题描述】:

我正在开发一个“穷人矩阵”的应用程序,即。 1 和 0 从屏幕上掉下来。

到目前为止,我已经设法让二维数组在第一个用户输入上显示一行,在第二个用户输入上显示 2 行,在第三个用户输入上显示 3 行等。

问题是,第一行总是停留在顶部,我无法获得“下拉”效果。它总是在用户输入的前一行/行的下方附加一行 1 和 0。

示例 - 到目前为止它是如何工作的:

我的二维数组:

1 0 1 0 1 1 1 (1st row)
0 1 0 1 0 1 0 (2nd row)
0 0 1 0 1 0 1 (3rd row)
1 0 0 1 0 1 0 (4th row)

第一个用户输入 (Console.ReadKey();):

1 0 1 0 1 1 1 (1st row)

2cnd 用户输入 (Console.ReadKey();):

1 0 1 0 1 1 1 (1st row)
0 1 0 1 0 1 0 (2nd row)

第三个用户输入:

1 0 1 0 1 1 1 (1st row)
0 1 0 1 0 1 0 (2nd row)
0 0 1 0 1 0 1 (3rd row)

等等

我想要实现的是类似但“相反”的顺序。

示例 - 我想要达到的目标:

第一个用户输入:

1 0 1 0 1 1 1 (1st row)

2cnd 用户输入:

0 1 0 1 0 1 0 (2nd row)
1 0 1 0 1 1 1 (1st row)

第三个用户输入:

0 0 1 0 1 0 1 (3rd row)
0 1 0 1 0 1 0 (2nd row)
1 0 1 0 1 1 1 (1st row)

所以,总结一下,我想修改我现有的代码,以便总是最后添加第一行。或者可能从数组的末尾开始读取 - 最后一行。我已经尝试过了,但我经常收到outOfRange 错误...

欢迎任何帮助。

仅在现有行下方添加额外行的代码:

public static int row = 0;
static void PrintRelevantLines()

    Console.Clear();
    if (rowl <= pnms.GetLength(0) - 1)
    
        for (int i = 0; i <= row; i++)
        
            for (int j = 0; j <= pnms.GetLength(1) - 1; j++)
            
                Console.Write(pnms[i, j]);
            
            Console.WriteLine();
        
    
    row += 1;

编辑:我要求的答案是

for (int i = row; i >= 0; i--;)

提供者:Pranav Hosangadi

但我接受了 Caius Jard 的回答,因为他超出了我的要求。

谢谢。

【问题讨论】:

你的意思是“在下面添加列...”列是垂直的东西。列下方的任何内容都是..同一列 请看例子。我添加了 1st、2cnd、3rd 等以进行澄清 仅供参考,看来你所说的列,世界其他地方都称为行。如果您愿意,您可以继续将其称为专栏,但对于您寻求帮助的人来说,这将是一个永久困惑的根源 反向迭代有什么问题? for (int i = rowl; i &gt;= 0; i--)? @PranavHosangadi 我不断收到outOfRange 错误。我再试一次 【参考方案1】:

给你;这是矩阵效应:

            int width = 60; //draw 60 columns
            int height = 20; //draw 20 rows

            var chars = "1234567890-=qwertyuiop[]asdfghjkl;'#zxcvbnm,./!\"£$%^&*()_+QWERTYUIOPASDFGHJKL:@~ZXCVBNM<>?".ToCharArray(); //create an array of chars to randomly choose and pump onto screen

            var r = new Random(); //make only one Random. Never make a Random in a loop

            while (true) //forever
            
                int randCol = r.Next(0, width); //pick which column we will draw now

                for (int i = 0; i < height; i++)               //for every row from top to bottom
                    Console.SetCursorPosition(randCol, i);      //put the cursor there
                    Console.Write(chars[r.Next(chars.Length)]); //pump a random char
                    Thread.Sleep(200);                          //it's a bit fast otherwise
                
            

我还没有完全给出你的练习的解决方案,因为它看起来像一个家庭作业(而且我不做家庭作业),但我希望你能逐步完成它并看看它是如何工作的,并做出您需要对程序进行调整以获得您所追求的结果

也许,例如,您可以将行保存在 2D 缓冲区中,并且可以随机决定列(就像我所做的那样),并且可以通过向下读取列(或向上),写入屏幕,与您从缓冲区中选择的列相同,然后选择另一列

也许您可以定期将行插入缓冲区(通过它滚动新数据)。

也许你也可以先把字符写成白色,然后在你用白色写新字符之前用灰色覆盖它(当屏幕填满时很难看到效果)

然后你可以同时写多个不同偏移量的字符..

..然后你可以把它交给 codegolf.se.com 的窥视者,他们会给你写一个版本,比如 15 个字符的 05AB1E 之类的东西

【讨论】:

谢谢。试了一下,看起来很棒。我想我将不得不再次观看矩阵 =) 我会研究它是如何工作的。到目前为止,我给了你一个+1。我将等待 Pranav 回答这个问题,因为他的代码实际上解决了我的问题。如果他在一天左右没有发布 anwser,我会接受你的。 我不知道 05ABE 应该是什么意思 这真的回答了这个问题吗?因为这些行没有按照 OP 要求的方式打印 - 它们仍然从上到下打印,新数字出现在列的底部,而不是好像它们“下降”,每个数字向下移动一行该列已填满。 编辑了我的问题,也为问题提供了答案。由于没有其他 anwser 并且 OP 超出了我的要求,我接受了这个 anwser。 好的,这只是一个小时,但没问题。如果解决了,我就不管了!

以上是关于以相反的顺序显示二维数组的行的主要内容,如果未能解决你的问题,请参考以下文章

对于二维数组,有行优先顺序和啥两种不同的存储方式

以螺旋顺序打印二维数组

关于vector创建的二维数组

二分查找二维数组

如何在 C++ 中获取二维动态数组的行数和列数

c语言查找二维数组的鞍点 新生求助大佬