ARC 011C - ダブレット
解法
編集距離が1の単語間に辺を貼って幅優先探索した後, 経路復元します.
ソースコード
#include <iostream> #include <map> #include <queue> #include <utility> #include <vector> #include <algorithm> using namespace std; using P_SI = pair<string, int>; int main() { map<string, int> step; map<string, string> hist; // 経路復元に使用 string first, last; cin >> first >> last; hist[first] = first; step[last] = -1; hist[last] = last; int n; cin >> n; for (int i = 0; i < n; i++) { string s; cin >> s; step[s] = -1; hist[s] = s; } queue<P_SI> que; que.push(make_pair(first, 0)); step[first] = 0; // 幅優先探索 while (!que.empty()) { P_SI st = que.front(); que.pop(); string cur = st.first; int cost = st.second; for (auto mapping : step) { string next = mapping.first; int diff = 0; for (int i = 0; i < cur.size(); i++) { if (cur[i] != next[i]) diff++; } if (diff == 1 && step[next] < 0) { step[next] = cost + 1; hist[next] = cur; que.push(make_pair(next, cost + 1)); } } } if (step[last] < 0) { cout << -1 << endl; return 0; } vector<string> history; history.push_back(last); string cur = hist[last]; while (cur != first) { history.push_back(cur); cur = hist[cur]; } history.push_back(cur); reverse(history.begin(), history.end()); cout << history.size() - 2 << endl; for (string h : history) { cout << h << endl; } return 0; }
感想
多分ARCのCの中でも簡単な方.