Minimum Operations to Reduce X to Zero
Problem is here: Minimum Operations to Reduce X to Zero - LeetCode
From the get-go, the main technique to be used here will be a BFS (Breadth-First-Search). No need to use weights, Dijkstra. Simple BFS should do it. The one, and very important point to bare in mind: when the bug lands on a position P, it does not mean that the bug can never land on P again. Remember that the bug might have come from a forward move, or might have come from a backwards move, and these are distinct, hence when you determine the key to mark P as visited, you actually have two distinct keys:
P + ForwardMove
P + BackwardsMove
Doing so is the key to solving it. Code is down below, cheers, ACC.
public class QueueItem { public int position; public bool forwardMove; public int steps; public int key; public QueueItem(int position, bool forwardMove, int steps) { this.position = position; this.forwardMove = forwardMove; this.steps = steps; this.key = position; if (forwardMove) this.key += 10000000; } } public class Solution { public int MinimumJumps(int[] forbidden, int a, int b, int x) { Hashtable visited = new Hashtable(); Queuequeue = new Queue (); QueueItem qi = new QueueItem(0, true, 0); queue.Enqueue(qi); visited.Add(qi.key, true); foreach (int f in forbidden) { QueueItem qif = null; qif = new QueueItem(f, true, 0); if (visited.ContainsKey(qif.key)) return -1; visited.Add(qif.key, true); qif = new QueueItem(f, false, 0); if (visited.ContainsKey(qif.key)) return -1; visited.Add(qif.key, true); } while (queue.Count > 0) { QueueItem current = queue.Dequeue(); if (current.position == x) return current.steps; if (current.position <= 10000) { //Forward QueueItem fqi = new QueueItem(current.position + a, true, current.steps + 1); if (!visited.ContainsKey(fqi.key)) { visited.Add(fqi.key, true); queue.Enqueue(fqi); } if (current.forwardMove) { //Backwards QueueItem bqi = new QueueItem(current.position - b, false, current.steps + 1); if (bqi.position >= 0 && !visited.ContainsKey(bqi.key)) { visited.Add(bqi.key, true); queue.Enqueue(bqi); } } } } return -1; } }
Comments
Post a Comment