function minTransitions(state) {
const visited = new Set();
const queue = new PriorityQueue();
queue.put([state, 0, 0], 0);
while (!queue.isEmpty()) {
const [state, floor, nTransitions] = queue.get();
const gState = JSON.stringify([floor, genericState(state)]);
if (visited.has(gState)) {
continue;
}
visited.add(gState);
if (atGoal(state)) {
return nTransitions;
}
const items = state[floor];
const payloads = getCombinations(items);
for (const payload of payloads) {
for (const direction of [-1, 1]) {
const newFloor = floor + direction;
if (newFloor < 0 || newFloor > 3) {
continue;
}
const newState = move(state, floor, newFloor, payload);
if (willFry(newState[floor]) || willFry(newState[newFloor])) {
continue;
}
const priority = nTransitions + 1 + heuristic(newState);
queue.put([newState, newFloor, nTransitions + 1], priority);
}
}
}
return -1;
}