【问题标题】:How do I put 2D arrays from a queue into another 2D array based on a condition? C#如何根据条件将队列中的二维数组放入另一个二维数组? C#
【发布时间】:2023-03-21 07:25:02
【问题描述】:

我有一个基于俄罗斯方块编队的任务,我必须将其放入队列中,然后从队列中(如果条件适用)将编队放入二维数组中,并以最佳方式填充数组。 我从二维数组制作编队并将它们放入队列中,但我不知道如何将队列中的编队放入二维数组。确定一个编队是否进入二维数组的条件是是否有足够的空间容纳它。如果没有,则应将编队 enqueue()d 到队列的末尾,以便稍后再次使用。

int[,] I1 = new int[4, 1] { { 1 }, { 1 }, { 1 }, { 1 } };
int[,] I2 = new int[1, 4] { { 1, 1, 1, 1 } };
int[,] Z1 = new int[3, 2] { { 0, 1 }, { 1, 1 }, { 1, 0 } };

等等。

这些都在这个队列中:

Queue<int[,]> myqueue = new Queue<int[,]>();
myqueue.Enqueue(I1);
myqueue.Enqueue(I2);
myqueue.Enqueue(Z1);

我尝试将它们复制到这样的二维数组中:

int[,] Drawer = new int[10, 20];
for (int i = 0; i < Drawer.GetLength(0); i++)
{
    for (int j = 0; j < Drawer.GetLength(1); j++)
    {
        while (Drawer[i,j]==0&& myqueue.Count >0)
        {
            int[,] dequeued = myqueue.Dequeue();
            for (int k = 0; k < dequeued.GetLength(0); k++)
            {
                for (int l = 0; l < dequeued.GetLength(1); l++)
                {
                    Drawer[i, j] = dequeued[k, l];
                }
            }
        }
    }
}

但它不起作用。我还考虑过不完全将项目复制到数组中,而只是根据队列中的项目用适当数量的 1 填充数组。 (我编辑了代码并将匈牙利变量更改为英语并添加了一个条件,因此它不会是一个无限循环。此外,Drawer[,] 数组是一个矩阵,应该显示一个包含元素的抽屉,如自动填充整个矩阵而不留下任何空白空间的俄罗斯方块。)

【问题讨论】:

    标签: c# arrays matrix queue 2d


    【解决方案1】:

    我不太确定你的问题。您也没有提供有关 Fiok(数据结构等)的信息。

    但我发现这些代码很奇怪:

    while (Fiok[i,j]==0)
            {
                int[,] kisorolt = sor.Dequeue();
                for (int k = 0; k < kisorolt.GetLength(0); k++)
                {
                    for (int l = 0; l < kisorolt.GetLength(1); l++)
                    {
                        Fiok[i, j] = kisorolt[k, l];
                    }
                }
            }
    

    您的 while 语句会给您无限循环,因为您没有更改代码上的 ij (所以如果 Fiok[i,j ] 为 0,那么您将 dequeue 您的 queue 无限次,然后最终导致程序崩溃,因为您 dequeue-ing 是一个空的 queue) ,所以我认为您的意思是 if 语句而不是使用 while

    if (Fiok[i,j]==0)
    {
          int[,] kisorolt = sor.Dequeue();
          for (int k = 0; k < kisorolt.GetLength(0); k++)
          {
              for (int l = 0; l < kisorolt.GetLength(1); l++)
              {
                  Fiok[i, j] = kisorolt[k, l];
              }
           }
    }
    else
    {
       //put any else statement
    }
    

    我已经测试了你的代码,输出是:

     11000000000000000000
     00000000000000000000
     00000000000000000000
     00000000000000000000
     00000000000000000000
     00000000000000000000
     00000000000000000000
     00000000000000000000
     00000000000000000000
     00000000000000000000
    

    【讨论】:

    • 我编辑了我的问题,使其易于理解,并将任何匈牙利变量名称转换为英语。还添加了另一个 while 条件,因此它不会创建无限循环。我按照您的建议使用 if 进行了尝试,但结果相同。
    • 我已经编辑了我的答案,你能用你的代码发布输出期望吗?谢谢@akiron111
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 2014-09-03
    相关资源
    最近更新 更多