752. 打开转盘锁

 1 class Solution 
 2 {
 3 public:
 4     string plusOne(string s, int j) // 将 s[j] 向上拨动一次
 5     {
 6         if(s[j] == '9') s[j] = '0';
 7         else s[j] += 1;
 8         return s;
 9     }
10     string minusOne(string s, int j) // 将 s[i] 向下拨动一次
11     {
12         if(s[j] == '0') s[j] = '9';
13         else s[j] -= 1;
14         return s;
15     }
16 
17     int openLock(vector<string>& deadends, string target) 
18     {
19         unordered_set<string> deads; // 记录需要跳过的死亡密码
20         for (auto s : deadends) deads.insert(s);
21         unordered_set<string> visited; // 记录已经穷举过的密码,防止走回头路
22         queue<string> q;
23         int step = 0; // 从起点开始启动广度优先搜索
24         q.push("0000");
25         visited.insert("0000");
26 
27         while (!q.empty()) 
28         {
29             int sz = q.size();
30             /* 将当前队列中的所有节点向周围扩散 */
31             for (int i = 0; i < sz; i++) 
32             {
33                 string cur = q.front();
34                 q.pop();
35 
36                 /* 判断是否到达终点 */
37                 if (deads.count(cur)) continue;
38                 if (cur == target) return step;
39                 
40                 /* 将一个节点的未遍历相邻节点加入队列 */
41                 for (int j = 0; j < 4; j++) 
42                 {
43                     string up = plusOne(cur, j);
44                     if (!visited.count(up)) 
45                     {
46                         q.push(up);
47                         visited.insert(up);
48                     }
49                     string down = minusOne(cur, j);
50                     if (!visited.count(down)) 
51                     {
52                         q.push(down);
53                         visited.insert(down);
54                     }
55                 }
56             }
57             /* 在这里增加步数 */
58             step++;
59         }
60         // 如果穷举完都没找到目标密码,那就是找不到了
61         return -1;
62     }
63 };

 

posted @ 2020-04-24 16:07  Jinxiaobo0509  阅读(169)  评论(0)    收藏  举报