public static int[,] GenerateRotatingWalkMatrix(int n) { if (n < 1 || n > 100) { throw new ArgumentOutOfRangeException( "The size of the matrix should be positive integer number " + "in the range [1..100]!"); } int[,] outputMatrix = new int[n, n]; int number = 1; Point currentCell = new Point() { Row = 0, Col = 0 }; Direction currentDir = new Direction() { DirX = 1, DirY = 1 }; FillMatrixWhilePossible(n, outputMatrix, ref number, currentCell, ref currentDir); number++; currentCell = GetFirstEmptyCell(outputMatrix); if (currentCell != null) { currentDir.DirX = 1; currentDir.DirY = 1; FillMatrixWhilePossible(n, outputMatrix, ref number, currentCell, ref currentDir); } return outputMatrix; }
static Direction GetNextDirection(Direction currentDirection) { int[] dirX = { 1, 1, 1, 0, -1, -1, -1, 0 }; int[] dirY = { 1, 0, -1, -1, -1, 0, 1, 1 }; for (int i = 0; i < dirX.Length; i++) { if (dirX[i] == currentDirection.DirX && dirY[i] == currentDirection.DirY) { Direction nextDirection = new Direction() { DirX = dirX[(i + 1) % dirX.Length], DirY = dirY[(i + 1) % dirX.Length] }; return nextDirection; } } throw new InvalidOperationException( String.Format( "Could not find the next direction: dirX={0}, dirY={1}", currentDirection.DirX, currentDirection.DirY)); }
private static void FillMatrixWhilePossible(int n, int[,] outputMatrix, ref int number, Point currentCell, ref Direction currentDir) { while (true) //malko e kofti tova uslovie, no break-a raboti 100% :) { outputMatrix[currentCell.Row, currentCell.Col] = number; if (!CheckDirections(outputMatrix, currentCell.Row, currentCell.Col)) { break; // prekusvame ako sme se zadunili } while (IsNextCellAvailable(n, outputMatrix, currentCell, currentDir)) { currentDir = GetNextDirection(currentDir); } currentCell.Row += currentDir.DirX; currentCell.Col += currentDir.DirY; number++; } }
private static bool IsNextCellAvailable( int n, int[,] matrix, Point cell, Direction dir) { return cell.Row + dir.DirX >= n || cell.Row + dir.DirX < 0 || cell.Col + dir.DirY >= n || cell.Col + dir.DirY < 0 || matrix[cell.Row + dir.DirX, cell.Col + dir.DirY] != 0; }