描述
已知有两个字串 A,B 及一组字串变换的规则(至多6个规则):
A1−>B1
A2−>B2
规则的含义为:在 A$中的子串 A1可以变换为B1、A2可以变换为B2 …。
例如:A=′abcd′B=’xyz’
变换规则为:
‘abc’->‘xu’ ‘ud’->‘y’ ‘y’->‘yz’
则此时,A可以经过一系列的变换变为B,其变换的过程为:
‘abcd’->‘xud’->‘xy’->‘xyz’
共进行了三次变换,使得 A变换为B。
格式
输入格式
第一行为两个字符串,第二行至文件尾为变换规则
AB
A1
A2B2 |-> 变换规则
… … /
所有字符串长度的上限为 20。
输出格式
若在 10 步(包含 10步)以内能将 A变换为B ,则输出最少的变换步数;否则输出”NO ANSWER!”
代码
BFS…再加上那么一点点STL小技巧、
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <map>
#define INF 1000
using namespace std;
struct Trans{
string a,b;
Trans(const string &a,const string &b){
this->a=a; this->b=b;
}
};
int n=1,d[1000],ans=20;
string A,B;
string a,b;
vector<Trans> trans;
map<string,int> dic;
bool bfs(){
queue<string> q;
q.push(A); dic[A]=0;
while(!q.empty()){
const string temp=q.front(); q.pop();
if(dic[temp]>10) return false;
if(temp==B) {
ans=dic[temp]; return true;
}
for(int i=0;i<(int)trans.size();i++){
int pos=temp.find(trans[i].a);
while(pos!=(int)string::npos){
string t2(temp);
t2.replace(pos,trans[i].a.length(),trans[i].b);
if(dic.count(t2)==0) {
q.push(t2); dic[t2]=dic[temp]+1;
}
pos=temp.find(trans[i].a,pos+1);
}
}
}
return false;
}
int main(){
freopen("in.txt","r",stdin);
cin>>A>>B;
while(cin>>a>>b) trans.push_back(Trans(a,b));
if(bfs()) printf("%d",ans);
else printf("NO ANSWER!");
return 0;
}

本文介绍了一种使用广度优先搜索(BFS)算法实现字符串转换的方法,通过定义一系列转换规则,可以在限定步骤内找到从一个字符串A转换到另一个字符串B所需的最少转换次数。文中详细解释了算法流程,并提供了一个C++实现示例。
613

被折叠的 条评论
为什么被折叠?



