public IEnumerable <KeyValuePair <string, string> > AlignedSequence()
        {
            var rmIncr       = 0;
            var seq1Incr     = 0;
            var seq2Incr     = 0;
            var resultMatrix = new List <KeyValuePair <string, string> >();

            TracebackPath.Reverse();
            foreach (var tracebackItem in TracebackPath)
            {
                if (tracebackItem == Move.DiagonalMove) // match
                {
                    resultMatrix.Add(new KeyValuePair <string, string>(
                                         Sequence1[seq1Incr].ToString(),
                                         Sequence2[seq2Incr].ToString()));
                    seq1Incr++;
                    seq2Incr++;
                }
                else if (tracebackItem == Move.VerticalMove)
                {
                    resultMatrix.Add(new KeyValuePair <string, string>(
                                         "-", Sequence2[seq2Incr].ToString()));
                    seq2Incr++;
                }
                else
                {
                    resultMatrix.Add(new KeyValuePair <string, string>(
                                         Sequence1[seq1Incr].ToString(), "-"));
                    seq1Incr++;
                }

                rmIncr++;
            }
            return(resultMatrix);
        }
        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));
        }