不会直接学习答案。发现确实还是BFS,自己一开始没想通
把这个字符串的变化理解为一个8叉树就好了;
class Solution {
public:
unordered_set<string> hash;
//此段代码可进一步简化为2行见文末
string schange(string s,int i)
{
if(i%2)
{
if(s[i/2]=='9')
s[i/2]='0';
else
s[i/2]++;
}
else
{
if(s[i/2]=='0')
s[i/2]='9';
else
s[i/2]--;
}
return s;
}
int openLock(vector<string>& deadends, string target) {
queue<string> q;
int res=0,count=0;
unordered_set<string> dead(deadends.begin(),deadends.end());
string psch,ps="0000";
q.push(ps);
hash.insert(ps);
while(!q.empty())
{
int size=q.size();
for(int j=0;j<size;++j)
{
ps=q.front();
q.pop();
//查询是否在死区
if(dead.count(ps)) continue;
//中止条件发现目标
if(ps==target) return res;
for(int i=0;i<8;++i)
{
psch=schange(ps,i);
if(!hash.count(psch))
{q.push(psch);hash.insert(psch);}
}
}
res++;
}
return -1;
}
};
进一步学习了字符串的变化,利用ascii码表,可以进一步简化代码
string schange(string s,int i)
{
s[i/2]=i%2?(s[i/2]+3)%10+48:(s[i/2]+1)%10+48;
return s;
}