intBoynextdoorFaqSearch(int l){ int ans = 0; queue<string> q; queue<int> step; q.push(A[0]); step.push(0); while (!q.empty() && q.front() != B[0] && step.front() <= 10) { if (KangShifu[q.front()]) { q.pop(); step.pop(); continue; // 去重 } KangShifu[q.front()] = true; for (int i = 1; i <= l; ++i) { string s = q.front(); // 用一个string记录下当前需要修改的字符串 while (true) { // 可能不止修改一次 int loc = s.find(A[i]); if (loc == -1) break; // 并没有找到 string ss = q.front(); // 再复制一份需要修改的字符串 ss.replace(loc, A[i].size(), B[i]); // 修改 q.push(ss); // 把它扔进队列 step.push(step.front() + 1); // 步骤数 + 1 s[loc] = '~'; // 把这个能搜到的地方用一个无关紧要的放起来 // 防止下次还能被搜到 } } q.pop(); step.pop(); // 处理完毕 } if (q.empty() || step.front() > 10) ans = -1; // 如果队列空了或超过10步了,输出NO ANSWER! else ans = step.front(); // 否则输出真正的答案 return ans; }
intmain(int argc, constchar * argv[]){ int l = 0; while (cin >> A[l] >> B[l]) ++l; --l; if (l == 0 && A[0] != B[0]) puts("NO ANSWER!"); else { int v = BoynextdoorFaqSearch(l); // Boy Next Door if (v == -1) puts("NO ANSWER!"); elsecout << v << endl; } return0; }