我需要读取一个文件,其中存储了一辆车的矩阵(1=蓝色汽车,2=红色汽车,0=空)。
我需要编写一个算法来移动矩阵中的汽车:
- 蓝色的向下移动;
- 红色的向右移动;
- 有一个“回合”,蓝色全部移动,然后再轮到红色。
在读取文件之前,我不知道矩阵的大小以及是否密集或稀疏,因此我必须实现两种数据结构(一种用于密集矩阵,另一种用于稀疏矩阵)和两个算法。
我需要达到尽可能的最佳时间和空间复杂度。
由于矩阵大小未知,我考虑将数据存储在堆上。
如果矩阵是密集的,我考虑使用类似以下的东西:
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
但是仍然存在找到下一个位置所在的问题。
可能这不是最好的方法,那么如何以高效的方式实现稀疏情况?(同时使用稀疏的唯一结构)