- 分析
BFS的题目,这道题搞懂,基本上BFS的题目就没啥问题了。如果我们不管所有的限制条件,不管deadends和target的限制,就思考一个问题:如何让你设计一个算法,穷举所有可能的密码组合,怎么做?很简单,使用穷举,再简单一点,如果你只转一下锁,有几种可能?总共有4个位置,每个位置可以向上转,也可以向下转,也就是有8种。也就是转一次可以出多少种结果,思考从“0000”转2次可以有多少种结果。到这来应该有解决这个问题的思路了。但是需要注意的是,可能需要进行去重,比如“0000”转一次可能是“1000”,而“1000”转一次又可以是“0000”。而“0000”我们已经访问过了。 - 代码
class Solution {
public:
int openLock(vector<string>& deadends, string target) {
if(find(deadends.begin(), deadends.end(), "0000") != deadends.end()) return -1;
unordered_map<string, bool> judge;
queue<string> que;
que.push("0000");
judge["0000"] = true;
int step = 0;
while(!que.empty()){
int size = que.size();
while(size--){
string s = que.front();
que.pop();
if(s == target){
return step;
}
for(int i = 0; i < 4; i++){
string temp = up(s, i);
if(!judge[temp] && find(deadends.begin(), deadends.end(), temp) == deadends.end()) que.push(temp);
judge[temp] = true;
temp = down(s, i);
if(!judge[temp] && find(deadends.begin(), deadends.end(), temp) == deadends.end()) que.push(temp);
judge[temp] = true;
}
}
step++;
}
return -1;
}
string up(string s, int i){
if(s[i] == '9'){
s[i] = '0';
}else{
s[i] += 1;
}
return s;
}
string down(string s, int i){
if(s[i] == '0'){
s[i] = '9';
}else{
s[i] -= 1;
}
return s;
}
};