private static Coordinates GetNextCoordinates(Coordinates currentCoordinates, SpiralDirections currentDirection) { var newCoordinates = new Coordinates { x = currentCoordinates.x, y = currentCoordinates.y }; switch (currentDirection) { case SpiralDirections.right: newCoordinates.x++; break; case SpiralDirections.down: newCoordinates.y++; break; case SpiralDirections.left: newCoordinates.x--; break; case SpiralDirections.up: newCoordinates.y--; break; } return newCoordinates; }
public static List<List<int>> GetNumberSpriralGrid(int dimension) { // build an empty grid var totalCells = 0; List<List<int>> grid = new List<List<int>>(); for (int i = 0; i < dimension; i++) { List<int> row = new List<int>(); for (var j= 0; j < dimension; j++) { row.Add(0); totalCells++; } grid.Add(row); } // get the mid point var mid = (dimension / 2) + 1; var currentCoordinates = new Coordinates { x = mid - 1, y = mid - 1 }; var currentDirection = SpiralDirections.up; grid[currentCoordinates.x][currentCoordinates.y] = 1; var currentValue = 2; while (currentValue <= totalCells) { var desiredCoordinates = GetNextCoordinates(currentCoordinates, GetNextDirection(currentDirection)); var currentCourseCooredinates = GetNextCoordinates(currentCoordinates, currentDirection); if (grid[desiredCoordinates.x][desiredCoordinates.y] == 0) { grid[desiredCoordinates.x][desiredCoordinates.y] = currentValue; currentCoordinates = desiredCoordinates; currentDirection = GetNextDirection(currentDirection); } else { grid[currentCourseCooredinates.x][currentCourseCooredinates.y] = currentValue; currentCoordinates = currentCourseCooredinates; } currentValue++; } return grid; }