方法一:广度优先搜索
class Solution {
public:
int openLock(vector<string>& deadends, string target) {
char pos[10]={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; //用来将数字转换为char的查询表
set<string> set(deadends.begin(),deadends.end()); //将死亡列表放入set
if (target.empty())
return -1;
queue<string> q; //初始化队列
q.push("0000");
int res=0;
while(!q.empty()){ //广度优先遍历
int size=q.size();
for(int i=0;i<size;i++){ //遍历当前队列所有元素
string top=q.front();
q.pop();
if(top==target)
return res;
if(set.find(top)==set.end()){ //若不在set中则放入set,并将所有位数的字母加一减一放入队列中
set.insert(top);
for(int j=0;j<top.size();j++){
string s1=top,s2=top;
s1[j]= pos[(s1[j]-'0' + 11) % 10];
s2[j]= pos[(s2[j]-'0' + 9) % 10];
q.push(s1);
q.push(s2);
}
}
}
res++;
}
return -1;
}
};