public object GetResult(object setup, Operator op)
            {
                // Lo recibido es un puzle deslizante
                SlidingPuzzle puzzle = (SlidingPuzzle)setup;
                // Un puzle deslizante se puede clonar a nivel profundo
                SlidingPuzzle puzzleClone = puzzle.DeepClone();


                if (SlidingPuzzleSolver.UP.Equals(op))
                {
                    if (puzzleClone.CanMoveUp(puzzleClone.GapPosition))
                    {
                        puzzleClone.MoveUp(puzzleClone.GapPosition);
                    }
                    else // No puede ocurrir que el operador aplicable no funcione, porque ya se comprobó que era aplicable
                    {
                        throw new InvalidOperationException("This operator is not working propertly");
                    }
                }

                if (SlidingPuzzleSolver.DOWN.Equals(op))
                {
                    if (puzzleClone.CanMoveDown(puzzleClone.GapPosition))
                    {
                        puzzleClone.MoveDown(puzzleClone.GapPosition);
                    }
                    else // No puede ocurrir que el operador aplicable no funcione, porque ya se comprobó que era aplicable
                    {
                        throw new InvalidOperationException("This operator is not working propertly");
                    }
                }

                if (SlidingPuzzleSolver.LEFT.Equals(op))
                {
                    if (puzzleClone.CanMoveLeft(puzzleClone.GapPosition))
                    {
                        puzzleClone.MoveLeft(puzzleClone.GapPosition);
                    }
                    else // No puede ocurrir que el operador aplicable no funcione, porque ya se comprobó que era aplicable
                    {
                        throw new InvalidOperationException("This operator is not working propertly");
                    }
                }

                if (SlidingPuzzleSolver.RIGHT.Equals(op))
                {
                    if (puzzleClone.CanMoveRight(puzzleClone.GapPosition))
                    {
                        puzzleClone.MoveRight(puzzleClone.GapPosition);
                    }
                    else // No puede ocurrir que el operador aplicable no funcione, porque ya se comprobó que era aplicable
                    {
                        throw new InvalidOperationException("This operator is not working propertly");
                    }
                }

                // Si el operador no se reconoce o es un NoOp, se devolverá la configuración actual (que sería idéntica a la original, no ha habido cambios)
                return(puzzleClone);
            }