/* 此处为超时答案,使用了BFS的思想 */
class Solution {
public:
string upString(string s,int j){
if(s[j] == '9')
s[j] = '0';
else
s[j] += 1;
return s;
}
string downString(string s,int j){
if(s[j] == '0')
s[j] = '9';
else
s[j] -=1;
return s;
}
int findWay(vector<string>&dead,queue<string>&q,vector<string>&visited,string target,int step)
{
while(!q.empty()){
int num = q.size();
for(int i=0;i<num;i++){
string s = q.front();
q.pop();
if(find(dead.begin(),dead.end(),s) != dead.end())
continue;
if(s == target)
return step;
for(int j=0;j<4;j++){
string temp1 = downString(s,j);
if(find(visited.begin(),visited.end(),temp1) == visited.end()){
q.push(temp1);
visited.push_back(temp1);
}
string temp = upString(s,j);
if(find(visited.begin(),visited.end(),temp) == visited.end()){
q.push(temp);
visited.push_back(temp);
}
}
}
step++;
}
return -1;
}
int openLock(vector<string>& deadends, string target) {
queue<string> q;
vector<string> visited;
vector<string> dead;
int step = 0;
for(const string& s : deadends)
dead.push_back(s);
q.push(string("0000"));
int steps = findWay(dead,q,visited,target,step);
return steps;
}
};
* 此处为正确答案,使用BFS(广度搜索)很难受,当初想了很多办法,不明白哪里超时了,结果使用unordered_set替换vector就可以了,坑... */
class Solution {
public:
string upString(string s,int j){
if(s[j] == '9')
s[j] = '0';
else
s[j] += 1;
return s;
}
string downString(string s,int j){
if(s[j] == '0')
s[j] = '9';
else
s[j] -=1;
return s;
}
int openLock(vector<string>& deadends, string target) {
queue<string> q;
unordered_set<string>visited;
unordered_set<string> dead(deadends.begin(), deadends.end());
int step = 0;
q.push(string("0000"));
visited.insert(string("0000"));
while(!q.empty()){
int num = q.size();
for(int i=0;i<num;i++){
string s = q.front();
q.pop();
if(dead.find(s)!=dead.end())
continue;
if(s == target)
return step;
for(int j=0;j<4;j++){
string up = upString(s,j);
if(!visited.count(up)){
q.push(up);
visited.insert(up);
string down = downString(s,j);
if(!visited.count(down)){
q.push(down);
visited.insert(down);
}
}
}
}
step++;
}
return -1;
}
};