“年轻人切忌旋入技术细节漩涡, 那是无底之洞” ----Zeo
基础BFS加一堆字符串处理细节
逐个比较是否可替换
替换时把字符拆成三段 前 要替换的 后
根据string 特性
前 + 替换的 + 后 可得操作完毕后串
++步数压入队列继续BFS
map 进行判重
坑的不行
写的想吐
没感到任何技术提升
代码
#include <iostream>
#include <queue>
#include <map>
using namespace std;
int ans = 0;
string bts[6], ats[6];
string B;
map < string , int > m;
struct trr
{
string str;
int step;
}A;
queue <trr> q;
int tf = 0;
string trans(string a, int flag, int btsf)
{
string f = "", l = "", ans = "";
for(int i = 0; i < flag; i++)
f = f + a[i];
for(int i = flag + bts[btsf].length(); i < a.length(); i++ )
l = l + a[i];
f = f + ats[btsf] + l;
return f;
}
void bfs(trr A)
{
q.push(A);
while(!q.empty())
{
trr ret = q.front();
trr sa;
q.pop();
for(int i = 0; i < ret.str.length(); i++)
{
for(int j = 0; j < tf; j++)
{
string tmpt = bts[j];
if(ret.str[i] == tmpt[0] && i + tmpt.length() < ret.str.length() + 1)
{
for(int k = 0; k < tmpt.length(); k++)
{
if(ret.str[k + i] != tmpt[k])
goto l1;
}
sa.str = trans(ret.str, i, j);
sa.step = ret.step + 1;
if(sa.step > 10)
{
ans = sa.step;
return ;
}
if(sa.str == B)
{
ans = sa.step;
return ;
}
if(m[sa.str] == 0)
{
q.push(sa);
m[sa.str] ++;
}
}
l1:
continue;
}
}
}
}
int main()
{
cin>>A.str;
A.step = 0;
cin>>B;
while(cin>>bts[tf]>>ats[tf])
{
tf++;
}
bfs(A);
if (ans == 0 || ans > 10)
cout<<"NO ANSWER!"<<endl;
else
cout<<ans<<endl;
return 0;
}