/// <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); }
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; } }