题目大意:你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字: ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’ 。每个拨轮可以自由旋转:例如把 ‘9’ 变为 ‘0’,‘0’ 变为 ‘9’ 。每次旋转都只能旋转一个拨轮的一位数字。锁的初始数字为 ‘0000’ ,一个代表四个拨轮的数字的字符串。输出最小的旋转次数。
思路:典型的BFS,因为有最小的次数这样的字眼啊!!!而且字符串的长度还是不变的,不用BFS还用什么?
#include <iostream>
#include<queue>
#include<string>
#include<vector>
#include<unordered_set>
using namespace std;
int main(int argc, const char * argv[])
{
string target;
cin>>target;
unordered_set<string>dead;
int num;
cin>>num;
string tt;
for(int i=0;i!=num;++i)
{
cin>>tt;
dead.insert(tt);
}
if(dead.count("0000"))
{
cout<<"-1"<<endl;
return 0;
}
queue<string>temp;
temp.push("0000");
int res=0;
unordered_set<string>visited;
visited.insert("0000");
while(!temp.empty())
{
++res;
int number=(int)temp.size();
while(number--)
{
string tt=temp.front();
temp.pop();
for(int i=0;i<4;++i)
{
for(int j=-1;j<=1;++j)
{
string m=tt;
if(!j)
continue;
m[i]=(m[i]-'0'+j+10)%10+'0';
if(m==target)
{
cout<<res<<endl;
return 0;
}
if(!visited.count(m)&&!dead.count(m))
{
visited.insert(m);
temp.push(m);
}
}
}
}
}
cout<<-1<<endl;
}