字串变换
一个简单的 \(bfs\) ,只是扩展结点时比较"另类",还有一点迭代加深搜索的味道
数据范围较小,无需\(kmp\) ,暴力判断就好
认识到了两点
- \(\because\) 无符号数相减不会出现负数,\(\therefore\) 当小数减大数时会得到一个很大的数. \(\therefore\) 应该避免无符号数相减
- 在提交程序之前一定要仔细检查是否有为了调试而输出的中间结果!
#include <iostream>
#include <cstdio>
#include <string>
#include <queue>
#include <map>
using namespace std;
const int MAXN=30;
string a[MAXN],b[MAXN];
map<string,int>vis;
struct state
{
string s;
int dist;
state(string ss,int d):s(ss),dist(d){}
};
queue<state>Q;
int main()
{
string A,B,c,d;
int ans = 100+1;
cin >> A >> B;
int n=0;
while(cin >> c >> d)
{
a[++n] = c;
b[n] = d;
}
Q.push(state(A,0));
while(!Q.empty())
{
state u = Q.front();Q.pop();
string& s=u.s;
if(s == B)
{
ans = u.dist;
break;
}
for(int i = 1; i <= n; i++)
{
const int len1 = s.length(), len2 = a[i].length() ;
//不能用 s.length() - a[i].length(),因为无符号数相减,
//若被减数小于减数,结果不是负数而是一个很大的正数,会导致 j 超出范围!
for(int j = 0;j <= len1 - len2; j++)
{
if(s.substr(j, a[i].length() ) == a[i])
{
string v = s;
v.replace(j,a[i].length(),b[i]);
if(!vis.count(v))
{
vis[v]=1;
Q.push(state(v, u.dist + 1));
}
}
}
}
}
if(ans <= 10)cout << ans;
else cout << "NO ANSWER!";
return 0;
}