---
# System prepended metadata

title: 752-Open the Lock
tags: [Medium]

---

# 752-Open the Lock
###### tags: `Medium`
* Question:
https://leetcode.com/problems/open-the-lock/

* Key:
1. 先確認deadends中有無"0000"，並把deadend都放入visited中，未來就可以同時檢查有嘗試過的數和deadends的數
2. 四位數遍尋跟其他地圖四個方位遍尋一樣，queue用來記錄下一次要嘗試的數字，每次嘗試就是檢查是否符合target，並對每個嘗試的數的每一位進行加一或減一(reverse wheel)，接著作檢查，放入queue和visited中，直到queue沒數值就停止遍尋，代表能找的範圍已經找完，沒找到代表碰到deadends

## BFS Solution
```cpp=
class Solution {
public:
    int openLock(vector<string>& deadends, string target) {
        // Prepare for BFS
        // 因為不能走到 deadends 裡面的排列，所以我們直接放進 visited，這樣做 BFS 時就不會考慮這些路線
        unordered_set<string> visited(deadends.begin(), deadends.end());
        array<char, 10> digit= {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};

        queue<string> todo;
        // 假設 0000 沒有在 visited(也就是 deadends 裡沒有) 中，我們才需要開始尋找
        if(!visited.count("0000")) {
            todo.push("0000");
            visited.insert("0000");
        }

        // Start BFS
        int steps = -1;
        while(!todo.empty()) {
            ++steps;
//queue有幾個數就對幾個數進行加或減一
            for(int sz = todo.size() - 1; sz >= 0; --sz) {
                string cur = todo.front();
                todo.pop();

                // Check if it's target
                if(cur == target) {
                    return steps;
                }

                // Go through neighbors
                // 如何找到對的 neighbor, i是為了遍尋4位數的哪一位數，j是為了對該位數增加+1或-1
                for(int i = 0; i < 4; ++i) {
                    for(int j = -1; j <= 1; j += 2) {
                        string neighbor = cur;
                        // Wrap around index to prevent out-of-bound error
                        neighbor[i] = digit[(neighbor[i]-'0'+j+10) % 10];
//遍尋過的數字就丟入queue跟visited
                        if(!visited.count(neighbor)) {
                            todo.push(neighbor);
                            visited.insert(neighbor);
                        }
                    }
                }
            }
        }

        return -1;
    }
};
```