首先让你的矩阵为空。在我的示例中,我在 std::pair 上使用了 std::map,但您也可以使用二维数组。我使用 std::map 是因为它更容易看到元素何时丢失。
typedef std::pair<int,int> Coordinate;
typedef std::map<Coordinate,int> Matrix;
然后制作一个包含您想要移动的不同方向的集合。
如果首先要向右移动,则意味着将 X 加 1,然后保持 Y 不变。然后我们向下移动,这意味着将 Y 加 1 并离开 X。
typedef std::vector<Coordinate> Moves;
Moves moves;
moves.push_back(std::make_pair(1,0));
moves.push_back(std::make_pair(0,1));
moves.push_back(std::make_pair(-1,0));
moves.push_back(std::make_pair(0,-1));
初始化您的起始坐标,它们会移动,直到您到达“边界”。边界要么是边框,要么是已经填充的单元格。
Coordinate currentPosition = std::make_pair(0,0);
int currentValue = 1;
int currentMovePosition = 0;
然后在一个循环中(但我把这个作为练习留给你写出来:-))只需填写矩阵:
matrix[currentPosition] = currentValue;
++currentValue;
并移动到下一个位置;
Coordinate nextPosition = currentPosition;
nextPosition.first += moves[currentMovePosition].first;
nextPosition.second += moves[currentMovePosition].second;
检查 nextPosition 以查看您是否在矩阵之外(nextPosition.first/second = 矩阵大小)。
如果您仍在矩阵内,请在地图中使用 std::find 以查看该条目是否已被填写:
if (matrix.find(nextPosition)!=matrix.end()) /* valid position */
如果碰到矩阵的边界或者碰到一个已经填好的条目,再次取当前位置,递增 currentMovePosition 以改变方向,然后重试。
如果您改变方向,请务必环绕 currentMovePosition。
currentMovePosition = (currentMovePosition + 1) % 4;
继续这样做,直到矩阵完全填满。
要判断矩阵是否被完全填满,可以检查是否所有4个方向都移动到已经被填满的元素,但更简单的方法是简单地计算被填满的单元格的数量,如果等于size*size则停止矩阵。