#include <iostream>
#include<stdlib.h>
#include<string>
#include<vector>
using namespace std;
vector<string> wordlist= { "hot","dot","dog","lot","log","cog" };
vector<vector<int>>v;//下标表示第i个单词,存储的是与单词相差一个字母的单词在wordlist中的下标
vector<bool> visited;
vector<vector<int>>ans;//要最短hhh
vector<int>path;
int min_trans = 999999;//最少的转变次数
string start="hit";
string endWord="cog";
//判断两个单词是不是只相差一个字母
bool OneCharDifferent(string left, string right) {
int count = 0;
for (int i = 0; i < left.length(); i++) {
if (left[i] != right[i])
count++;
if (count > 1)
return false;
}
return true;
}
//一些初始化操作
void init() {
wordlist.push_back(start);//将 开始单词作为最后一个单词;process从最后开始
visited.resize(wordlist.size());//一定要放在上面这句话的后面
v.resize(wordlist.size());
for (int i = 0; i < wordlist.size(); i++) {
for (int j = i + 1; j < wordlist.size();j++)
if (OneCharDifferent(wordlist[i], wordlist[j])) {
v[i].push_back(j);
v[j].push_back(i);
}
}
}
//打印结果
void print() {
for (int i = 0; i < ans.size(); i++) {
for (int j = 0; j < ans[i].size(); j++)
cout << wordlist[ans[i][j]] << " ";
cout << endl;
}
}
//current表示当前单词的下标,wordNum表示已经记录的单词个数
void process(int current,int wordNum) {
if (wordNum > min_trans)
return;
if (wordlist[current] == endWord) {
if (wordNum<min_trans){ // ;因为前面已经确保wordNum<=min_trans了
ans.clear();
min_trans = wordNum;//千万不能忘记啊
}
ans.push_back(path); //只要wordNum<=min_trans
return;
}
//遍历与current单词相差一个字母的单词
for (int i = 0; i < v[current].size(); i++) {
if (visited[v[current][i]] == false){
visited[v[current][i]] = true;
path.push_back(v[current][i]);
process(v[current][i], wordNum + 1);
//还原
visited[v[current][i]] = false;
path.pop_back();
}
}
}
int main() {
init();
visited[visited.size() - 1] = true;
//*visited.end() = true; //应该等价吧
path.push_back(visited.size() - 1);
process(visited.size() - 1, 1);
cout << ans.size()<<endl;
print();
system("pause");
return 0;
}