Мне нужно прочитать файл, в котором хранится матрица с автомобилями (1 = BlueCar, 2 = RedCar, 0 = Empty).
Мне нужно написать алгоритм для перемещения машин матрицы таким образом:
- синие движутся вниз;
- красные двигаются вправо;
- есть поворот, в котором движутся все синие, и поворот для перемещения всех красных.
Перед чтением файла я не знаю размер матрицы, и если он плотный или разреженный, поэтому я должен реализовать две структуры данных (один для плотной и один для разреженных) и два алгоритма.
Мне нужно достичь наилучшего возможного времени и пространства.
Из-за неизвестного размера матрицы, я думаю, хранить данные в куче.
Если матрица плотная, я думаю использовать что-то вроде:
short int** M = new short int*[m];
short int* M_data = new short int[m*n];
for(int i=0; i< m; ++i)
{
M[i] = M_data + i * n;
}
С помощью этой структуры я могу выделить непрерывное пространство памяти, а также получить доступ к M[i][j]
.
Теперь проблема заключается в структуре выбора для случая разреженного, и я должен также рассмотреть, как я могу перемещать автомобили по алгоритму самым простым способом: например, когда я оцениваю автомобиль, Мне нужно легко найти, если в следующей позиции (вниз или вправо) есть другой автомобиль или если он пуст.
Сначала я решил определить объекты BlueCar и RedCar, которые наследуются от общего объекта Car. В этих объектах я могу сохранить координаты матрицы, а затем поместить их в:
std::vector<BluCar> sparseBlu;
std::vector<RedCar> sparseRed;
В противном случае я могу сделать что-то вроде:
vector< tuple< row, column, value >> sparseMatrix
Но проблема поиска того, что в следующей позиции все еще остается.
Возможно, это не лучший способ сделать это, так как я могу эффективно реализовать разреженный случай? (также используя уникальную структуру для разреженных)