Пример #1
0
        /// <summary>
        /// Solve the multiplication
        /// </summary>
        /// <param name="pivot">The pivot diagonal</param>
        /// <param name="tp">The type of diagonal</param>
        /// <param name="multSize">The size of the product</param>
        /// <returns>The multiplication product</returns>
        private long GridMultiplication(ref int[] pivot, GridMultiplicationType tp, int multSize)
        {
            int x    = pivot[0],
                y    = pivot[1];
            long res = this.Grid[pivot[0], pivot[1]];

            for (int i = 0; i < multSize - 1; i++)
            {
                try
                {
                    UpdatePivot(ref pivot, tp);
                }
                catch (Exception)
                {
                    pivot[0] = x;
                    pivot[1] = y;
                    return(0);
                }
                res *= this.Grid[pivot[0], pivot[1]];
            }
            pivot[0] = x;
            pivot[1] = y;
            return(res);
        }
Пример #2
0
        private void UpdatePivot(ref int[] pivot, GridMultiplicationType tp)
        {
            switch (tp)
            {
            case GridMultiplicationType.LeftBottomDiagonal:
                UpdatePivot(ref pivot, GridMultiplicationType.Left);
                UpdatePivot(ref pivot, GridMultiplicationType.Down);
                break;

            case GridMultiplicationType.LeftUpDiagonal:
                UpdatePivot(ref pivot, GridMultiplicationType.Left);
                UpdatePivot(ref pivot, GridMultiplicationType.Up);
                break;

            case GridMultiplicationType.RightBottomDiagonal:
                UpdatePivot(ref pivot, GridMultiplicationType.Right);
                UpdatePivot(ref pivot, GridMultiplicationType.Down);
                break;

            case GridMultiplicationType.RightUpDiagonal:
                UpdatePivot(ref pivot, GridMultiplicationType.Right);
                UpdatePivot(ref pivot, GridMultiplicationType.Up);
                break;

            default:
                switch (tp)
                {
                case GridMultiplicationType.Down:
                    pivot[0] += 1;
                    if (pivot[0] >= this.Grid.GetUpperBound(1))
                    {
                        throw new Exception("Invalid operation");
                    }
                    break;

                case GridMultiplicationType.Up:
                    pivot[0] -= 1;
                    if (pivot[0] < 0)
                    {
                        throw new Exception("Invalid operation");
                    }
                    break;

                case GridMultiplicationType.Left:
                    pivot[1] -= 1;
                    if (pivot[1] < 0)
                    {
                        throw new Exception("Invalid operation");
                    }
                    break;

                case GridMultiplicationType.Right:
                    pivot[1] += 1;
                    if (pivot[1] >= this.Grid.GetUpperBound(0))
                    {
                        throw new Exception("Invalid operation");
                    }
                    break;
                }
                break;
            }
        }