Как поместить двумерные массивы из очереди в другой двумерный массив на основе условия? C # - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть задача, основанная на формациях тетриса, которую я должен поместить в очередь, а затем из очереди (если выполняется условие) поместить формацию в двумерный массив с наиболее оптимальным заполнением массива. Я сделал формирования из 2D-массивов и поместил их в очередь, но я не знаю, как получить формирования из очереди в 2D-массив. Условие, которое определяет, попадет ли формация в двумерный массив, состоит в том, достаточно ли места для него. Если нет, формирование должно быть 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);

И я попытался скопировать их в 2D-массив следующим образом:

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];
                }
            }
        }
    }
}

Но это не работает. Я также подумал не о точном копировании элемента в массив, а просто о заполнении массива соответствующим количеством единиц, основываясь на элементе из очереди. (Я отредактировал код и изменил венгерские переменные на английский и добавил условие, чтобы оно не было бесконечным циклом. Также массив Drawer [,] - это матрица, которая должна отображать ящик, содержащий элементы, например, автоматический тетрис, который заполняет всю матрицу, не оставляя пустого пространства.)

1 Ответ

0 голосов
/ 26 апреля 2018

Я не совсем уверен в вашем вопросе. Вы также не предоставляете информацию о 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];
                }
            }
        }

ваш , в то время как оператор даст вам бесконечный цикл, потому что вы не изменили i или j в своем коде (так что если Fiok [i, j] равен 0 , тогда вы будете снимать с очереди свою очередь на бесконечное время, а затем в конечном итоге завершать работу вашей программы, потому что вы исключение очереди пустая очередь ) поэтому я думаю, что вы имеете в виду выражение 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
...