#include <iostream>
#include <string>
#include <vector>
#include <deque>
#include <set>
using namespace std;
//扩展 寻找临节点
void extend(const string &cur,vector<string>&child,set<string>&visited,const string &end_,const set<string>&dict)
{
string parent=cur;
child.clear(); //child 每次更新
for (int i=0;i<parent.size();i++)
{
char t=parent[i];
for (char c='a';c!='z';c++)
{
if(c==t)
continue;
parent[i]=c;
//变换后的parent 在wordlist找得到或者=end 且不存在与visited
if ((parent==end_||dict.find(parent)!=dict.end())&&(visited.find(parent)==visited.end()))
{
child.push_back(parent);
visited.insert(parent);
}
parent[i]=t;
}
}
}
int calc_wordladder(const string& start_,const string& end_,const set<string>& dict )
{
deque<string> q;
vector<string> child; //可扩展节点
set<string> visited; //已访问节点
int step=0;
q.push_back(start_);
while (!q.empty())
{
string cur=q.front();
q.pop_front();
extend(cur,child,visited,end_,dict); //得到cur的扩展
for (vector<string>::const_iterator it=child.begin();it!=child.end();it++) //*it为内容
{
if(*it==end_)
return step;
q.push_back(*it);
}
step++;
}
}
int main()
{
//vector<string> dict; //wordlist
set<string> dict;
dict.insert("hot");
dict.insert("lot");
dict.insert("dot");
dict.insert("dog");
dict.insert("log");
string start_="hit";
string end_="cog";
int dist_=calc_wordladder(start_,end_,dict);
cout<<dist_;
return 0;
}
wordladder
最新推荐文章于 2021-07-25 14:57:18 发布