Exemplo n.º 1
0
        private IEnumerable<HeapNode> getValidMoves(string[] plan, HeapNode node, int[,] distances)
        {
            int left = node.Square - 1;
            int right = node.Square + 1;
            int up = node.Floor - 2;
            int down = node.Floor + 2;

            // left
            if (left >= 0 && (plan[node.Floor][left] == '#' || plan[node.Floor][left] == 'F') && distances[node.Floor, node.Square] + 2 < distances[node.Floor, left])
            {
                distances[node.Floor, left] = distances[node.Floor, node.Square] + 2;
                yield return new HeapNode(node.Floor, left);
            }

            // right
            if (right < plan[node.Floor].Length && (plan[node.Floor][right] == '#' || plan[node.Floor][right] == 'F') && distances[node.Floor, node.Square] + 2 < distances[node.Floor, right])
            {
                distances[node.Floor, right] = distances[node.Floor, node.Square] + 2;
                yield return new HeapNode(node.Floor, right);
            }

            // up
            if (up < plan.Length && (plan[up][node.Square] == '#' || plan[up][node.Square] == 'F') && plan[up - 1][node.Square] == '|' && distances[up, node.Square] + 3 < distances[up, node.Square])
            {
                distances[up, node.Square] = distances[node.Floor, node.Square] + 3;
                yield return new HeapNode(up, node.Square);
            }

            // down
            if (down > 0 && (plan[down][node.Square] == '#' || plan[down][node.Square] == 'F') && plan[down - 1][node.Square] == '|' && distances[down, node.Square] + 1 < distances[down, node.Square])
            {
                distances[down, node.Square] = distances[node.Floor, node.Square] + 1;
                yield return new HeapNode(down, node.Square);
            }
        }
Exemplo n.º 2
0
        public int wayTime(string[] plan)
        {
            int[] start = new int[2];
            int[] end = new int[2];

            for (int floor = 0; floor < plan.Length; floor += 2)
            {
                for (int square = 0; square < plan[floor].Length; square++)
                {
                    if (plan[floor][square] == 'S')
                    {
                        start[Floor] = floor;
                        start[Square] = square;
                    }

                    if (plan[floor][square] == 'F')
                    {
                        end[Floor] = floor;
                        end[Square] = square;
                    }
                }
            }

            int[,] distances = new int[plan.Length, plan[0].Length];

            int minDistance = int.MaxValue;
            HeapNode root = new HeapNode(start[Floor], start[Square]);
            MinHeap heap = new MinHeap(root, distances);
            while (heap.HasItems)
            {
                HeapNode node = heap.Top();

                foreach (HeapNode move in getValidMoves(plan, node, distances))
                {
                    if (plan[move.Floor][move.Square] == '#')
                    {
                        heap.Add(move);
                    }
                    else if (plan[move.Floor][move.Square] == 'F' && minDistance > distances[move.Floor, move.Square])
                    {
                        minDistance = distances[move.Floor, move.Square];
                    }
                }
            }

            return minDistance;
        }
Exemplo n.º 3
0
 public void Add(HeapNode n)
 {
     m_tail++;
     m_data[m_tail] = n;
     Bubble(m_tail);
 }
Exemplo n.º 4
0
 public MinHeap(HeapNode root, int[,] distances)
 {
     m_data = new HeapNode[1000000];
     m_data[0] = root;
     m_tail = 0;
     m_distances = distances;
 }