题面 给出两个单词(开始单词和结束单词)以及一个词典。找出从开始单词转换到结束单词所需的最短转换序列。转换规则如下:每次只能改变一个字母;转换过程中出现的单词(除开始单词和结束单词外)必须存在于词典中。例如,开始单词为 hit,结束单词为 cog,词典为 hot, dog, dot, lot, log,那么一种可能的最短变换是 hit hot dot dog cog,所以返回的结果是序列的长度 5。注意:如果找不到这种变换,则输出 0;词典中所有单词的长度相同;所有的单词都由小写字母构成;开始单词和结束单词可以不在词典中。
输入 hit cog hot dot dog lot log
输出 5
思路 AC 代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 #include <iostream> #include <algorithm> #include <string> #include <cstdio> #include <cstring> #include <queue> #include <unordered_map> #include <map> using namespace std;int tt = 0 ;string start, last; queue<string> q; unordered_map<string, int > dis; int bfs () { q.push (start); dis[start] = 0 ; while (!q.empty ()) { string t = q.front (); q.pop (); if (t == last)return dis[last] ; string str = t; for (int i = 0 ; i < t.size ();i++) { char d = 'a' ; for (d = 'a' ; d <= 'z' ; d++) { char c = t[i]; t[i] = d; if (dis.count (t)&&!dis[t]) { q.push (t); dis[t] = dis[str] + 1 ; } t[i] = c; } } } return dis[last]; } int main () { cin >> start >> last; cin.ignore (); string str; getline (cin, str); string a[1000 ]; dis[last] = 0 ; for (int i = 0 ; i < str.size (); i++) { char c = str[i]; if (c == ' ' ) tt++; if (c != ' ' )a[tt] += c; } for (int i = 0 ; i <= tt; i++) dis[a[i]] = 0 ; cout << bfs ()<<endl; return 0 ; }