## Algorithm

Problem Name: 752. Open the Lock

You have a lock in front of you with 4 circular wheels. Each wheel has 10 slots: `'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'`. The wheels can rotate freely and wrap around: for example we can turn `'9'` to be `'0'`, or `'0'` to be `'9'`. Each move consists of turning one wheel one slot.

The lock initially starts at `'0000'`, a string representing the state of the 4 wheels.

You are given a list of `deadends` dead ends, meaning if the lock displays any of these codes, the wheels of the lock will stop turning and you will be unable to open it.

Given a `target` representing the value of the wheels that will unlock the lock, return the minimum total number of turns required to open the lock, or -1 if it is impossible.

Example 1:

```Input: deadends = ["0201","0101","0102","1212","2002"], target = "0202"
Output: 6
Explanation:
A sequence of valid moves would be "0000" -> "1000" -> "1100" -> "1200" -> "1201" -> "1202" -> "0202".
Note that a sequence like "0000" -> "0001" -> "0002" -> "0102" -> "0202" would be invalid,
because the wheels of the lock become stuck after the display becomes the dead end "0102".
```

Example 2:

```Input: deadends = ["8888"], target = "0009"
Output: 1
Explanation: We can turn the last wheel in reverse to move from "0000" -> "0009".
```

Example 3:

```Input: deadends = ["8887","8889","8878","8898","8788","8988","7888","9888"], target = "8888"
Output: -1
Explanation: We cannot reach the target without getting stuck.
```

Constraints:

• `1 <= deadends.length <= 500`
• `deadends[i].length == 4`
• `target.length == 4`
• target will not be in the list `deadends`.
• `target` and `deadends[i]` consist of digits only.

## Code Examples

### #1 Code Example with Java Programming

```Code - Java Programming```

``````
class Solution {
public int openLock(String[] deadends, String target) {
return -1;
}
Set seen = new HashSet<>();
int steps = 0;
int[] rotations = {-1, 1};
while (!queue.isEmpty()) {
int size = queue.size();
for (int i = 0; i < size; i++) {
String removed = queue.remove();
if (removed.equals(target)) {
return steps;
}
continue;
}
for (int j = 0; j < 4; j++) {
for (int rotation : rotations) {
int changedVal = ((removed.charAt(j) - '0') + rotation + 10) % 10;
String newRotation = new StringBuilder()
.append(removed.substring(0,j))                                                                                         .append(changedVal)
.append(removed.substring(j + 1))
.toString();
if (!seen.contains(newRotation)) {
}
}
}
}
steps++;
}
return -1;
}
}
``````
Copy The Code &

Input

cmd
eadends = ["0201","0101","0102","1212","2002"], target = "0202"

Output

cmd
6

### #2 Code Example with Javascript Programming

```Code - Javascript Programming```

``````
const openLock = function(deadends, target, count = 0) {
let visited = new Set();
return -1;
}

let q = [];
q.push("0000");

let steps = 0;
while (q.length > 0) {
let len = q.length;

for (let j = 0; j < len; j++) {
let cur = q.shift();

for (let i = 0; i < 4; i++) {
let slot = parseInt(cur[i]);
let before = cur.substr(0, i);
let after = cur.substr(i + 1);

let left = (10 + slot - 1) % 10;
let leftCode = before + left + after;
if (leftCode === target) {
return steps + 1;
}

q.push(leftCode);
}

let right = (10 + slot + 1) % 10;
let rightCode = before + right + after;
if (rightCode === target) {
return steps + 1;
}

q.push(rightCode);
}
}
}
steps++;
}

return -1;
};
``````
Copy The Code &

Input

cmd
eadends = ["0201","0101","0102","1212","2002"], target = "0202"

Output

cmd
6

### #3 Code Example with Python Programming

```Code - Python Programming```

``````
class Solution:
moved, q, cnt, move = set(deadends), ["0000"], 0, {str(i): [str((i + 1) % 10), str((i - 1) % 10)] for i in range(10)}
if "0000" in moved:
return -1
while q:
new = []
cnt += 1
for s in q:
for i, c in enumerate(s):
for cur in (s[:i] + move[c] + s[i + 1:], s[:i] + move[c] + s[i + 1:]):
if cur not in moved:
if cur == target:
return cnt
new.append(cur)
q = new
return -1
``````
Copy The Code &

Input

cmd
eadends = ["8888"], target = "0009"

Output

cmd
1