1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| private const int N = 80;
public static int GetAnswer() { int[,] sum = new int[N, N]; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { sum[i, j] = int.MaxValue; } } sum[0, 0] = data[0, 0]; Queue<Tuple<int, int>> pointsToBeUpdated = new Queue<Tuple<int, int>>(); pointsToBeUpdated.Enqueue(new Tuple<int, int>(0, 0)); while (pointsToBeUpdated.Count != 0) { var point = pointsToBeUpdated.Dequeue(); if (CanMoveToLeft(point)) { int newValue = sum[point.Item1, point.Item2] + data[point.Item1 - 1, point.Item2]; if (newValue < sum[point.Item1 - 1, point.Item2]) { sum[point.Item1 - 1, point.Item2] = newValue; pointsToBeUpdated.Enqueue(new Tuple<int, int>(point.Item1 - 1, point.Item2)); } }
if (CanMoveToRight(point)) { int newValue = sum[point.Item1, point.Item2] + data[point.Item1 + 1, point.Item2]; if (newValue < sum[point.Item1 + 1, point.Item2]) { sum[point.Item1 + 1, point.Item2] = newValue; pointsToBeUpdated.Enqueue(new Tuple<int, int>(point.Item1 + 1, point.Item2)); } }
if (CanUp(point)) { int newValue = sum[point.Item1, point.Item2] + data[point.Item1, point.Item2 - 1]; if (newValue < sum[point.Item1, point.Item2 - 1]) { sum[point.Item1, point.Item2 - 1] = newValue; pointsToBeUpdated.Enqueue(new Tuple<int, int>(point.Item1, point.Item2 - 1)); } }
if (CanDown(point)) { int newValue = sum[point.Item1, point.Item2] + data[point.Item1, point.Item2 + 1]; if (newValue < sum[point.Item1, point.Item2 + 1]) { sum[point.Item1, point.Item2 + 1] = newValue; pointsToBeUpdated.Enqueue(new Tuple<int, int>(point.Item1, point.Item2 + 1)); } } }
return sum[N - 1, N - 1]; }
private static bool CanMoveToLeft(Tuple<int, intpoint) { return point.Item1 > 0; }
private static bool CanMoveToRight(Tuple<int, intpoint) { return point.Item1 < N - 1; }
private static bool CanUp(Tuple<int, int> point) { return point.Item2 > 0; }
private static bool CanDown(Tuple<int, int> point) { return point.Item2 < N - 1; }
|