#include<bits/stdc++.h>
using namespace std;
struct node{
int ans;//记录转换次数
string s;
node(int a, string ss){
ans = a;
s = ss;
}
};
bool cmp(string a, int l1, int r1, string b){//逐位比较a[l1] ~ a[r1]和b[0] ~ b[b.length() - 1]
for(int i = l1, j = 0; i < r1; i++, j++){
if(a[i] != b[j])
return 0;
}
return 1;
}
int n;
string s, e;
string change[8], to[8];
bool kadd,kcut;
map<string, bool> st;//记录遍历过的字串
queue<node> q;
int bfs(){
q.push((node){0, s});
st[s] = 1;
while(!q.empty()){//广搜
node now = q.front();
q.pop();
if(now.ans >= 11)//如果搜的次数大于11就返回-1(输出"NO ANSWER!")
return -1;
for(int k = 1; k <= n; k++){//遍历变换规则
//可行性剪枝
if(now.s.length() < e.length() && !kadd)
continue;
if(now.s.length() > e.length() && !kcut)
continue;
if(now.s.length()<change[k].length())//string类型的.length()的返回值是unsigned long long
continue;
for(int i = 0; i <= now.s.length() - change[k].length(); i++){//遍历now.s字串的每一位做首位与change[k]对比
if(!cmp(now.s, i, i + change[k].length(), change[k])) // 逐位对比
continue;
//当相同时
string v(now.s);
v.replace(v.begin() + i, v.begin() + i + change[k].length(), to[k]);
replace函数将s1的某个区间内的字符修改为指定字符
s1.replace(s1.begin(),s1.begin()+5,"要更改为的内容");
注意s1.begin(),s1.begin()+5 是左闭右开区间
if(st[v])
continue;
st[v] = 1;
if(v == e)//如果搜到结果返回步数
return now.ans + 1;
q.push((node){now.ans + 1, v});
}
}
}
//搜不到返回-1
return -1;
}
int main()
{
cin>>s>>e;
kadd = 0;
kcut = 0;
for(int i = 1; i <= 6; i++){
if(cin>>change[i]>>to[i])
n = i;//鬼畜的输入
//转换前的字串长度大于转换后的长度 kcut为true
if(change[i].length() > to[i].length())
kcut = 1;
//转换前的字串长度小于转换后的长度 kadd为true
if(change[i].length() < to[i].length())
kadd = 1;
}
int awa = bfs();
if(awa == -1)
puts("NO ANSWER!");
else
printf("%d", awa);
}
共 1 条回复
%%%%