Цель моего алгоритма - складывать контейнеры на корабле. Я объясню, как я смоделировал свое трехмерное пространство, чтобы прояснить вопрос.
Корабль имеет контейнерный стол. Таблица контейнера содержит строки контейнера.
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: Пусто
Я немного растерялся с этим результатом. Алгоритм складывает контейнеры только в первую строку, и я хочу, чтобы он разделил контейнеры поровну по каждой строке корабля. Что я сделал не так?