Сначала сделайте вашу матрицу пустой.В моем примере я использую std :: map для std :: pair, но вы также можете использовать двумерный массив.Я использую 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.first / second <0 или> =размер матрицы).
Если вы все еще находитесь в матрице, используйте std :: find на карте, чтобы увидеть, заполнена ли эта запись:
if (matrix.find(nextPosition)!=matrix.end()) /* valid position */
Если вы столкнетесь сграницы матрицы или вы наткнетесь на запись, которая уже была заполнена, снова выберите текущую позицию, увеличьте currentMovePosition, чтобы изменить направление, и попробуйте снова.Обязательно оберните currentMovePosition, если вы измените направление.
currentMovePosition = (currentMovePosition + 1) % 4;
Продолжайте делать это, пока матрица не будет полностью заполнена.
Чтобы определить, полностью ли заполнена матрица, вы можете проверить, все лиВсе четыре направления перемещаются к элементам, которые уже заполнены, но более простой подход заключается в простом подсчете количества заполненных ячеек и остановке, если он равен размеру * размеру матрицы.