LeetCode 752.打开转盘锁
用unordered_set来进行查重速度快,每次有8种操作,也就是把一位数字加一或者减一,因为是bfs只要转到target次数就是最小的,注意次数要在遍历完队列中的所有元素之后增加
#include<queue>
#include<string>
#include<vector>
#include<iostream>
#include<unordered_set>
#define rep(i,a,b) for(int i=(a); i<(int)(b);++i)
#define _rep(i,a,b) for(int i=(a);i<=(int)(b);++i)
using namespace std;
class Solution {
public:
int openLock(vector<string>& deadends, string target) {
queue<string> q;
unordered_set<string> hash_dead;
unordered_set<string> visited;
for(string s:deadends)
hash_dead.insert(s);
if(hash_dead.find("0000")!=hash_dead.end())
return -1;
q.push("0000");
int ans=0;
while(!q.empty())
{
for(int k=q.size();k>0;--k)
{
string now=q.front();q.pop();
if(now.compare(target)==0)
return ans;
for(int i=0;i<4;++i)
{
string temp=now;
temp[i]=(temp[i]-'0'+1)%10+'0';
if(visited.find(temp)==visited.end()&&hash_dead.find(temp)==hash_dead.end())
{
visited.insert(temp);
q.push(temp);
}
temp=now;
temp[i]=(temp[i]-'0'+9)%10+'0';
if(visited.find(temp)==visited.end()&&hash_dead.find(temp)==hash_dead.end())
{
visited.insert(temp);
q.push(temp);
}
}
}
++ans;
}
return -1;
}
};
int main()
{
vector<string> a={"0201","0101","0102","1212","2002"};
Solution mine;
cout<<mine.openLock(a,"0202");
return 0;
}