//本程序是对照leetcode 找到岛屿而写的
//加入队列回查功能,将各个节点都进行保留
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<queue>
#include <unordered_set>
using namespace std;
class Solution {
public:
string plus_one(string str, int index)
{
if (str[index] == '9')
str[index] = '0';
else
{
str[index] = str[index] + 1;
}
return str;
}
string down_one(string str, int index)
{
if (str[index] == '0')
str[index] = '9';
else
{
str[index] = str[index] - 1;
}
return str;
}
int openLock(vector<string>& deadends, string target) {
unordered_set<string> deadset(deadends.begin(), deadends.end());
const string finnal_target(target);
queue<string>q;
vector<queue<string>> que_Pre ;//上次的队列容器
vector<queue<string>> que_Now;//这次经过扩增之后的队列容器
q.push("0000");
que_Now.push_back(q);
unordered_set<string>visited;
visited.insert("0000");
int step = 0;
while (!q.empty())
{
que_Pre = que_Now; //将上一次结果进行转存
que_Now.clear(); //将当前的路径进行清除操作
int queue_size = q.size();
for (size_t i = 0; i < queue_size; i++)
{
string str_cnw = q.front();
q.pop();
if (deadset.find(str_cnw) != deadset.end())
{//找到了不能经过的死路,那么就continue大循环
continue;
}
if (str_cnw.compare(finnal_target) == 0)
{
for (size_t i = 0; i < que_Pre.size(); i++)
{
if (que_Pre[i].back().compare(finnal_target) == 0)
{
this_road = que_Pre[i];
}
}
return step;
}
for (size_t i = 0; i < 4; i++)
{
string str_up = plus_one(str_cnw, i);
int count_num = visited.count(str_up);
if (visited.count(str_up) <= 0)
{
for (size_t i = 0; i < que_Pre.size(); i++)
{
if (que_Pre[i].back().compare(str_cnw)==0)
{
queue<string> que_tempUp = que_Pre[i];
que_tempUp.push(str_up);
que_Now.push_back(que_tempUp);
}
}
visited.insert(str_up);
q.push(str_up);
}
string str_down = down_one(str_cnw, i);
if (visited.count(str_down) <= 0)
{
for (size_t i = 0; i < que_Pre.size(); i++)
{
if (que_Pre[i].back().compare(str_cnw)==0)
{
queue<string> que_tempDown = que_Pre[i];
que_tempDown.push(str_down);
que_Now.push_back(que_tempDown);
}
}
visited.insert(str_down);
q.push(str_down);
}
}
}
step++;//在哪里进行加入步数的计数比较关键
}
return -1;
}
queue<string> this_road;
};
int main() {
vector<string> str_in = { "0201","0101","0102","1212","2002" };
string str_target("0202");
Solution s;
int step = s.openLock(str_in, str_target);
cout << step << endl;
cout << "解锁步骤" << endl;
while (!s.this_road.empty())
{
cout << s.this_road.front() << "->";
s.this_road.pop();
}
cout << endl;
system("pause");
return 0;
}
本程序进行了改进,加入了关于每一个步的路径进行输出:
并没有进行优化,问题还是有的,记录路径的程序有冗余
如果步数更多的话,那么就会非常的冗余,影响运算速度。先提出优化思路-》比如经过一段时间将一些和目标太远的queue从容器里删除,进行优化。希望大家交流。