问题描述以及解决过程如下导图
广搜实现如下
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <queue>
#include <set>
#include <map>
using namespace std;
/*判断两个单词是否有连接状态*/
bool connect(string &word1, string &word2) {
if (word1.length() == 0 || word2.length() == 0) {
return false;
}
int cnt = 0;
for (int i = 0; i < word1.length(); ++i) {
if (word1[i] != word2[i]) {
cnt ++;
}
}
if (cnt == 1) {
return true;
}
return false;
}
/*构建图*/
void get_graph(string &begin_word,
std::vector<string> &wordList,
std::map<string, std::vector<string> > &graph) {
wordList.push_back(begin_word);
for (int i = 0;i < wordList.size(); ++i ) {
graph[wordList[i]]= std::vector<string> ();
}
for (int i = 0;i < wordList.size(); ++i) {
for (int j = i + 1; j < wordList.size(); ++j) {
if (connect(wordList[i], wordList[j])) {
graph[wordList[i]].push_back(wordList[j]);
graph[wordList[j]].push_back(wordList[i]);
}
}
}
}
/*广搜获取最短长度*/
int get_length(string &begin_word, string &end_word,
std::map<string, std::vector<string> > graph) {
queue<pair<string,int>> Q;
set<string> visit;
Q.push(make_pair(begin_word,1));
visit.insert(begin_word);
while(!Q.empty()) {
/* code */
string node = Q.front().first;
int step = Q.front().second;
Q.pop();
if (node == end_word) {
return step;
}
std::vector<string> node_v = graph[node];
for (int i = 0;i < node_v.size(); ++i) {
if (visit.find(node_v[i]) == visit.end()) {
Q.push(make_pair(node_v[i], step + 1));
visit.insert(node_v[i]);
}
}
}
return 0;
}
int get_result(string &begin_word, string &end_word, std::vector<string> &wordList) {
std::map<string, std::vector<string> > graph;
get_graph(begin_word,wordList,graph);
return get_length(begin_word,end_word,graph);
}
int main(int argc, char const *argv[])
{
string begin_word = "hit";
string end_word = "cog";
std::vector<string> word_list;
for (int i = 0;i < 6; ++i) {
string tmp;
cin >> tmp;
word_list.push_back(tmp);
}
cout << get_result(begin_word, end_word, word_list);
return 0;
}
输出如下:
#输入
hot
dot
dog
log
lot
cog
#输出
5