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 };
Mamba never out

浙公网安备 33010602011771号