正题
评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P1032
题目大意
给若干个变化规则,表示A中的axa_xax子串可以变化为bxb_xbx中的子串,求至少要多少次变化才可以变为B子串。
解题思路
暴力广搜用mapmapmap库判重。
codecodecode
#include<iostream>
#include<cstdio>
#include<string>
#include<map>
#include<queue>
using namespace std;
queue<string> q;
map<string,int> d;
string s,ans,a[7],b[7];
int n;
bool cmps(string s,string a,int first,int len)
{for(int i=0;i<len;i++)if(s[first+i]!=a[i]) return false;//cout<<s<<' '<<a<<' '<<first<<' '<<len<<endl;return true;
}
int bfs()
{q.push(s);d[s]=0;while(!q.empty()){string x=q.front();if(d[q.front()]>=10) {q.pop();continue;}for(int j=1;j<=n;j++)for(int i=0;i<x.size();i++)if(cmps(x,a[j],i,a[j].size())){x.erase(i,a[j].size());x.insert(i,b[j]);if(!d[x]){d[x]=d[q.front()]+1;q.push(x);if(x==ans) return d[x];}x=q.front();}q.pop(); }return -1;
}
int main()
{cin>>s>>ans;n=1;if(s==ans){printf("0");return 0;}while(cin>>a[n]>>b[n]) n++;n--;int answer=bfs();if(answer==-1) printf("NO ANSWER!");else printf("%d",answer);
}