Checking for duplicate states on Closed performs the same function more efficiently (O(1)).
Changes to Expand:
Expand(u) children = {} for each name ∈ moveNames do child = mover.doMove(name, u) if child ≠ null // and not OccursOnPath(child, u) then d[child] = d[u] + 1 pred[child] = u // Scenario 1 if there is an x such that x = child and x ∈ Open then if d[child] < d[x] // Case 2 then d[x] = d[child] pred[x] = pred[child] Promote(PQ,x) else // Do nothing: Case 1 continue // Scenario 2 if there is an x such that x = child and x ∈ Closed then if d[child] < d[x] // Case 2 then d[x] = d[child] pred[x] = pred[child] Add(PQ,x) Add(Open,x) Remove(Closed,x) else // Do nothing: Case 1 continue add child to children return children
Note that some (and perhaps many) of the states previously returned by Expand will now simply be ignored by the else clauses that do nothing.