// BFS
class Solution
{
public:
int openLock(vector<string>& deadends, string target)
{
// BFS 模板,打印所有可能密码
queue <string> q;
unordered_set <string> version;
unordered_set <string> dead;
for (string str : deadends) dead.insert(str);
//把初始密码添加到队列中
q.push("0000");
version.insert("0000");
int depth = 0;
while (!q.empty())
{
int len = q.size();
for (int i = 0; i < len; i++)
{
string cur = q.front();
q.pop(); //使用队列中第一个元素后,立刻把其删除,不要放在后面删除,以防出现 bug
//判断是否是正确密码
if (dead.find(cur) != dead.end()) continue;
if (cur == target) return depth;
//if (!cur.compare(target)) return depth;
for (int j = 0; j < 4; j++)
{
//转动一次密码并添加到队列中
string up = plusone(cur, j);
//判断是否是回头路
if (version.find(up) == version.end())
{
q.push(up);
version.insert(up);
}
string down = minnusone(cur, j);
if (version.find(down) == version.end())
{
q.push(down);
version.insert(down);
}
}
}
depth++;
}
return -1;
}
private:
string plusone(string s, int i)
{
string ch = s;
if (ch[i] == '9') ch[i] = '0';
else ch[i] += 1;
return ch;
}
string minnusone(string s, int i)
{
string ch = s;
if (ch[i] == '0') ch[i] = '9';
else ch[i] -= 1;
return ch;
}
};
002 BFS 实现解开密码锁的最少次数 [C++]
猜你喜欢
转载自blog.csdn.net/weixin_47156401/article/details/120582703
今日推荐
周排行