public Coordinates Traceback(Coordinates coordinates) { if (coordinates.X > 0 || coordinates.Y > 0) { if (coordinates.Y == 0) // must be horizontal as we are on the top row { TracebackPath.Add(Move.HorizontalMove); return(Traceback(HorizontalMoveCoordinates(coordinates.X, coordinates.Y))); } if (coordinates.X == 0) // must be vertical as we are on left most column { TracebackPath.Add(Move.VerticalMove); return(Traceback(VerticalMoveCoordinates(coordinates.X, coordinates.Y))); } var verticalValue = VerticalMoveValue(coordinates.X, coordinates.Y); var diagonalValue = DiagonalMoveValue(coordinates.X, coordinates.Y); var horizontalValue = HorizontalMoveValue(coordinates.X, coordinates.Y); var currentValue = Grid.GetValue(coordinates.X, coordinates.Y); if (currentValue == diagonalValue) { TracebackPath.Add(Move.DiagonalMove); return(Traceback(DiagonalMoveCoordinates(coordinates.X, coordinates.Y))); } //get rid of ones that do not differ by one verticalValue = FindDifference(verticalValue, currentValue); diagonalValue = FindDifference(diagonalValue, currentValue); horizontalValue = FindDifference(horizontalValue, currentValue); if (diagonalValue >= horizontalValue && diagonalValue >= verticalValue) { TracebackPath.Add(Move.DiagonalMove); return(Traceback(DiagonalMoveCoordinates(coordinates.X, coordinates.Y))); } if (verticalValue >= horizontalValue && verticalValue >= diagonalValue) { TracebackPath.Add(Move.VerticalMove); return(Traceback(VerticalMoveCoordinates(coordinates.X, coordinates.Y))); } else { TracebackPath.Add(Move.HorizontalMove); return(Traceback(HorizontalMoveCoordinates(coordinates.X, coordinates.Y))); } } return(new Coordinates(0, 0)); }