C# - Как сложить трехмерные объекты в трехмерном пространстве? - PullRequest
1 голос
/ 19 июня 2020

Цель моего алгоритма - складывать контейнеры на корабле. Я объясню, как я смоделировал свое трехмерное пространство, чтобы прояснить вопрос.

Корабль имеет контейнерный стол. Таблица контейнера содержит строки контейнера.

public class ContainerTable : IContainerTable
{
    public List<IContainerRow> Rows { get; set;}

    public ContainerTable()
    {
        Rows = new List<IContainerRow>();
    }
}

Индекс списка строк контейнера определяет столбец таблицы контейнера, и каждый столбец имеет стек контейнера.

public class ContainerRow : IContainerRow
{
    public List<IContainerStack> ContainerStack { get; set; }

    public ContainerRow()
    {
        ContainerStack = new List<IContainerStack>();
    }
}

Стек контейнера определяет контейнеры, уложенные вертикально снизу вверх.

public class ContainerStack : IContainerStack
{
    public List<IContainer> Containers { get; set; }
    public int WeightOfStack { get; set; }

    public ContainerStack(List<IContainer> containers)
    {
        Containers = containers;
    }
}

Алгоритм автоматически генерирует таблицу на основе длины и ширины корабля.

public IContainerTable GetNewContainerTable(int shipLength, int shipWidth)
{
    IContainerTable table = new ContainerTable();

    for (int i = 0; i < shipLength; i++)
    {
        IContainerRow row = ContainerRow();
        table.Rows.Add(row);

        for (int j = 0; j < shipWidth; j++)
        {
            IContainerStack stack = ContainerStack();
            table.Rows[i].ContainerStack.Add(stack);
        }
    }
    return table;
}

Здесь я столкнулся с проблемами.

Алгоритм перебирает каждую строку и добавляет контейнер в каждый столбец. Это повторяется с самого начала, если еще остались контейнеры.

public IContainerTable AssignContainersToShip(List<IContainer> containers)
{
    //Represents the unsorted container list index.
    int i = 0;
    //Represents the table column
    int j = 0;

    while (i < containers.Count)
    {
        //Loop through each row.
        foreach (var row in _table.Rows)
        {
            //Loop through each column
            foreach (IContainerStack stack in _table.Rows[j].ContainerStack)
            {
                stack.Containers.Add(containers[i]);
                i++;
                //Go to the next column.
                if (j < _table.Rows.Count - 1)
                {
                    j++;
                }
                //Start from the first column when looping through the second row.
                else 
                {
                    j = 0;
                }
            }
        }
    }
    return _table;
} 

Ожидаемое поведение: Итак, если мы предположим, что на корабле есть таблица 2x2, на входе 4 контейнера, результат должен быть: Ряд 1 : - Колонка 1: контейнер 1 - Столбец 2: Контейнер 2

Ряд 2 : - Колонка 1: контейнер 3 - Колонка 2: Контейнер 4

Фактический результат: Ряд 1 : - Столбец 1: контейнер 1, контейнер 3 - Столбец 2: контейнер 2, контейнер 4

Ряд 2 : - Столбец 1: пусто. - Столбец 2: Пусто

Я немного растерялся с этим результатом. Алгоритм складывает контейнеры только в первую строку, и я хочу, чтобы он разделил контейнеры поровну по каждой строке корабля. Что я сделал не так?

1 Ответ

1 голос
/ 19 июня 2020
public IContainerTable AssignContainersToShip(List<IContainer> containers)
{
    //Represents the unsorted container list index.
    int i = 0;
    //Represents the table column
    int j = 0;

    while (i < containers.Count)
    {
        //Loop through each row.
        foreach (var row in _table.Rows)
        {
            //Loop through each column
            foreach (IContainerStack stack in _table.Rows[j].ContainerStack)
            {
                stack.Containers.Add(containers[i]);
                i++;                
            }
            j++;
        }
    }
    return _table;
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...